X



C++相談室 part131 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 3b96-ov1m)
垢版 |
2017/07/29(土) 11:28:28.97ID:o30VDF4g0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part130
http://mevius.2ch.net/test/read.cgi/tech/1490917669/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1478440682/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0052デフォルトの名無しさん (ワッチョイ 49ad-mf2b)
垢版 |
2017/08/06(日) 20:55:29.92ID:BHhmDaJC0
>>50
privateをpublicでdefineするやつじゃ?
0058デフォルトの名無しさん (オッペケ Sr35-6sbn)
垢版 |
2017/08/08(火) 08:21:06.59ID:RV4q7wpsr
>>57
うむ、こんなところだろう
1.既存のクラスに普通に手入れている
2.それは違うと>>53で言っているのに投下されるアスペなレス
3.privateな変数にアクセスするかと思いきや、privateな変数を出力するprivateな関数を呼び出すという意味の無い構成
4.deleteを使用するUNKOなコード
5.newを使用する残念なコード
6.コードへのリンクを投下するのでなくクソスレを経由するクソレス
7.例外安全でない
8.非staticにする必要性が感じられない
9.「(hoge->*(hoge->g()))();」というブザマな呼び出し方
0061C言語ますたー《ますたー軍団(常時募集)の長》 ◆oa6k//3vOQ (ラクッペ MMaf-bbbG)
垢版 |
2017/08/09(水) 18:43:38.11ID:s1XZJ5NhM
読んでないけどg()は関数ポインタを返す関数?
設計からしてダメだろ
0066デフォルトの名無しさん (ワッチョイ 9ac5-OW3C)
垢版 |
2017/08/11(金) 13:08:18.43ID:rA3728Ge0
C++の場合クラス(およびその基底クラス)内のメンバは全部ヘッダファイルを辿っていけばワカルのだから
まず全く同じ内容のヘッダファイルのコピーを作り、
ファイル名を適当に変えて、多重インクルード箇所もコピーしたもので閉じるように変更して、
privateやprotectedを全部publicにして、
クラスの名前をFoo→Foo2とか改変して、
仮想関数は適当に空の定義でもつけて、
 ((Foo2*)p)->(Fooのデータメンバ)
式にキャストしてアクセスすればデータメンバと仮想関数については問題なくアクセスできる

(ODR違反は都市伝説なので事実上これで動く
 だいたいprivate破りを意図している時点で実コードレベルで影響しない規約とか気にしても仕方が無い
0067デフォルトの名無しさん (ワッチョイ 9ac5-OW3C)
垢版 |
2017/08/11(金) 13:10:51.21ID:rA3728Ge0
Foo2の仮想関数が空ではないか、というのは動作上問題にならない
vtableのしくみがわかっているならワカル以下略

一方非仮想関数の方はちょっとうまい方法が思いつかない…
private属性のメンバ関数のアドレスがとれれば勝つるのだが
0068デフォルトの名無しさん (ワッチョイ 5b2b-7NHe)
垢版 |
2017/08/11(金) 15:28:00.96ID:CTzRRQx/0
class Base {
public:
Base() {};
virtual void func() {};
};

class Sub: public Base {
public:
Sub() {};
virtual void func() {};
};

Sub a();
std::vector<Base> b;
b.push_back(a);
b[0].func();
これだと継承前のBaseのfuncが実行されてSubのfuncが実行されないんですが
Subのfuncを実行するにはどうしたらいいですか
0070デフォルトの名無しさん (ワッチョイ 1a49-d9WE)
垢版 |
2017/08/11(金) 15:47:46.79ID:L0uHlCp20
>>68
そのコード本当に動く?
本質じゃなくて申し訳ないが、そのまま追試出来るコードじゃないと…

ちなみに質問の回答はスライスな。
0072デフォルトの名無しさん (ワッチョイ 1a49-d9WE)
垢版 |
2017/08/11(金) 16:00:31.30ID:L0uHlCp20
コピコンは省略可能だよー。
0084デフォルトの名無しさん (ワッチョイ 7665-KsLg)
垢版 |
2017/08/12(土) 16:56:14.99ID:srjAo6Ap0
質問です。

宣言は、全ての要素に対して必要なのですか?

n = a+b:

という行があるとすると、

#include <n>
#include <a>
#include <b>

が必要なのですか?
とても初心者なので、なにとぞ教えてください。
お願いします。
0087デフォルトの名無しさん (ワッチョイ 9ab1-KsLg)
垢版 |
2017/08/12(土) 17:21:05.88ID:Yn7dYYpz0
>84

#include
というのは、外部にあるファイルを読み込め
という命令なので、変数の宣言ではありません。

#include <a>

というのは、aというファイルを読み込めという
命令です。
n=a+b
という場合には、この式の前に、n, a, bという
変数の型を宣言する必要があります。
全てが整数ならば、
int a, b, n;
単精度実数ならば
float a, b, n;
と、倍精度実数ならば、
double a, b, n;
と書きます。
と変数の型を宣言します。

このことは、基本の基本なので、解説書の最初に書いてあるはずです。
解説書をよく読んで、その上で分からないことを
質問しましょう
008884 (ワッチョイ 7665-KsLg)
垢版 |
2017/08/12(土) 17:27:53.44ID:srjAo6Ap0
>>85-87
googleだけの独学なので、とても勉強になりました。

とても、ありがとうございました。
0094デフォルトの名無しさん (オッペケ Srbb-iw66)
垢版 |
2017/08/12(土) 21:29:22.94ID:B05a5g6/r
× #include <a>というのは、aというファイルを読み込めという命令
○ #include <a>というのは、aというヘッダーを読み込めという命令
○ #include <a>というのは、#include <a>をaというヘッダーの内容で置き換えろという命令
0097デフォルトの名無しさん (ワッチョイ 1a1b-8zUn)
垢版 |
2017/08/12(土) 23:26:56.30ID:IKUtZym10
仕様だとヘッダーとソースファイルは区別されてるみたいだけど
#includeはヘッダーとソースファイルのどちらも扱うから
二つを纏めてファイルと呼称しているとしたら>>94は間違いじゃないの?
0098デフォルトの名無しさん (ワッチョイ a30d-wsxY)
垢版 |
2017/08/13(日) 06:37:43.35ID:/9jKf3580
「C++の#includeがファイルを読み込むとは限らない」
という説明を何かで読んだ記憶がある。

例えばソースに #include <hoge.h> と書いてあっても
hoge.h というファイルの実体は存在しなくて、
コンパイラが内部的なスイッチとして使っても構わない、みたいな話。
実際にそういう動作をするコンパイラは知らんけど。
0102はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5a15-aEKd)
垢版 |
2017/08/14(月) 00:14:24.38ID:N3oVMbyu0
軸がわからないと自分が何をわかってないかすらわからないからクソみてぇな思い込みで検索して見当違いの方向に突っ込んでしまうから、
そうなってから質問しても質問が見当違いすぎて回答しようがないことはよくある。
0103デフォルトの名無しさん (ワッチョイ 336d-gaVt)
垢版 |
2017/08/15(火) 18:55:44.72ID:Q70B1fQS0
>>102
いっちょコンパイラを書いてやろうと思っているんだが何をやっていいかわからない…
手元の教科書は必死に正規表現やらチューリングマシンやらを追求している…
これってコンパイラ本だと思って買ったのだが、どうも本を間違えてしまったらしい
軸がわからないと悲惨ですね
0110デフォルトの名無しさん (ワッチョイ 3323-Eq/3)
垢版 |
2017/08/15(火) 20:03:18.47ID:BftRsONU0
>>103
yacc, lex (または bison, flex) とかは知ってる?
使うと構文解析が楽になるよ。
0111デフォルトの名無しさん (ワッチョイ 5baa-ixYY)
垢版 |
2017/08/15(火) 21:06:58.79ID:K8T9Hr6g0
>>108
単にstd::function使えって話じゃねーの?
0113デフォルトの名無しさん (ワッチョイ 5baa-ixYY)
垢版 |
2017/08/15(火) 21:38:42.75ID:K8T9Hr6g0
>>112
typedef bool(*Fun)();
にキャプチャしたデータを置いとく場所が無いんだからいつまでまっても実現しないよ
そういうC言語のAPIにはvoid*でユーザーデータ渡せて引数で取得できるようになってるはずなんだからそれに規則性があるのなら(例えば最初の引数がユーザーデータになってるとか)テンプレートでラッパー書くの簡単でしょ
0114デフォルトの名無しさん (ワッチョイ 1a49-d9WE)
垢版 |
2017/08/15(火) 21:53:17.41ID:+1mFvI7w0
>>105
できるも何も型が違うからエラーでしょ。
ラムダ型のオブジェクトはautoでしか受けられない。
0116デフォルトの名無しさん (ワッチョイ 5baa-uFAa)
垢版 |
2017/08/15(火) 23:55:50.09ID:K8T9Hr6g0
>>115
キャプチャしないラムダ式は関数ポインタに変換出来るだけ。束縛じゃない。
0120デフォルトの名無しさん (ブーイモ MMba-d9WE)
垢版 |
2017/08/16(水) 12:58:58.53ID:+9oABFYpM
もういない宣言出てるけど、スレッドローカルでやられても困るだけだと思う。
0121デフォルトの名無しさん (ワッチョイ 9ac5-OW3C)
垢版 |
2017/08/16(水) 14:20:28.94ID:5HjXxUQN0
>そしてそれをC言語の関数ポインタと互換性がある形で実装可能か考えてみるといい。
もともとC言語はλ式とか、(束縛変数がクラスのこともありえるが)クラスを構文でサポートしていないのだから
「C言語の関数ポインタと互換性がある形」と逝っただけでは何を指しているのか不明確にならざるおえない
呼び出し側がいかに煩雑な記述になろうとも、動けば互換性があるという立場をとってみるテスト、

束縛変数も毎回引数渡しすればC言語の関数ポインタと互換にできるのでは…
もはやクロージャでも何でも無いが一応動く
0122デフォルトの名無しさん (オッペケ Srbb-iw66)
垢版 |
2017/08/16(水) 14:36:46.12ID:53LlWcImr
>>121
>もはやクロージャでも何でも無いが一応動く
ちなみにどうでもいいことだがラムダ式から取得した関数ポインターはC++リンケージ型なのでC関数に渡してコンパイルが通る保証が無い
0124デフォルトの名無しさん (オッペケ Srbb-iw66)
垢版 |
2017/08/16(水) 15:34:56.89ID:53LlWcImr
>>123
関数名だけではない
extern "C" using CF = void(); と
using CPPF = void(); は似て非なる関数型
この二つはオーバーロード可能で互換性も無い
恐らくマングリのみならず関数呼び出し規約の違いを許容する思想
ただこれを正しく実装したコンパイラーを見たことは無い
0126デフォルトの名無しさん (ワッチョイ 4eaa-Kd4M)
垢版 |
2017/08/16(水) 15:59:31.27ID:CMzvSoma0
a = 0
2.times do
b = 1
3.times do
p a, b
end
end

「Rubyのしくみ」に書いてあるけど、Rubyは、Cで作ってあり、
do 〜 end のブロックは、クロージャの実装。
ラムダ・Proc も、ほとんど同じ

子のブロック内で、変数が見つからなければ、
外のスコープ(先祖の方向)へ遡って、探しに行く
0127デフォルトの名無しさん (オッペケ Srbb-iw66)
垢版 |
2017/08/16(水) 16:07:27.94ID:53LlWcImr
>>125
そのとおり
規格では別の型と規定されている
atexitなど関数ポインターを渡す関数ではCリンケージの関数ポインターを渡すかC++リンケージの関数ポインターを渡すかで
C版atexitとC++版atexitのオーバーロード呼び分けができることになっている

clang/G++は意図的に規格に従っていないというのが痛説
Visual C++は規格より自分が正しいという意味不明な見解
0132デフォルトの名無しさん (ワッチョイ b632-iGin)
垢版 |
2017/08/16(水) 18:35:35.31ID:lmNMFTOO0
そういうCのインタフェースにはたいてい関数ポインタの他にユーザデータを指定できるようになっててそこにthisなんかを入れておくものだが、 >>105 は関数オブジェクトを関数ポインタだけに変換したいと言っているわけか……

コードを動的に生成すれば不可能ではないだろうけど、色々トレードオフがあるから言語の機能にするのはどうだろうね。
ライブラリを作っても良いんだろうけど、おとなしく定石に従っておいた方が良いよ
0133デフォルトの名無しさん (ワッチョイ 5baa-uFAa)
垢版 |
2017/08/16(水) 22:53:19.96ID:VOMe5hsv0
>>132
動的にコードを生成したとしてもどこにその生成したコードを置くのか、それをどうやって解放するのかが問題になるね。だったらコード生成してもしなくても同じ事。
0134デフォルトの名無しさん (ワッチョイ b632-iGin)
垢版 |
2017/08/16(水) 23:14:18.00ID:lmNMFTOO0
>>133
> 動的にコードを生成したとしてもどこにその生成したコードを置くのか、それをどうやって解放するのかが問題になるね。
そうだね。

> だったらコード生成してもしなくても同じ事。
同じではないね。
0135デフォルトの名無しさん (ワッチョイ 5baa-uFAa)
垢版 |
2017/08/16(水) 23:47:46.20ID:VOMe5hsv0
>>134
言い方が悪かったかな?
「どこにその生成したコードを置くのか、それをどうやって解放するのか」が解決するのであれば、コードを動的に生成しなくてもキャプチャしたデータ自体をそこに置けばいいだけ。
0136デフォルトの名無しさん (ワッチョイ 5b32-eSaa)
垢版 |
2017/08/17(木) 02:40:17.43ID:PxJqlDv90
>>135
キャプチャしたデータ(またはそれへのポインタ)をコード以外のどこかに置くとして、それは関数ポインタ一つ(コードへのポインタをとるCのAPIにそのまま渡せる形)にはならないだろ。
何の話をしてるんだ?
0148デフォルトの名無しさん (スッップ Sdb3-2DsO)
垢版 |
2017/08/17(木) 18:53:03.48ID:p6ewHhXhd
理解しようという気持ちも理解する力もないのに質問すんなよ…
mfc ではやってたっけ?やってないんじゃないの?
というツッコミならともかく、
>>141>>142なんて思考力が虫以下だろ…どこのセグメントとかアホか
Win32 は古来よりフラットなリニアアドレスモデルだろ。
VirtualAlloc も知らなそうだし。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況