質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

216閲覧

C++ ヘッダの実装部について

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/09/16 03:40

こんにちは

ヘッダの実装部についての質問です。
以下のようなコードがうまく実行されません。

a.h----------------------------------------------

class A
{
public:
int a(vector<int>& x) ;
}

class B :public A
{
int b(vector<int>& y);
}

a.cpp(実装部)-----------------------------------------------

int A::a(vector<int>& x)
{
int m = 0;
m = x.capacity() / 2;
if(m * 2 == x.capacity()){return 0; }
else{return 1; }
}

int B::b(vector<int>& y)
{
if(!(a(y))){cout << "奇数\n";} /この部分がうまく実行されません/
else{cout << "偶数\n";}
return 0;
}


b.cpp---------------------------------------------

A* aa=new A;
vector<int> a;
a->b(a);


実行しても関数aがちゃんと動きません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

maisumakunさんへのコメントのソースなら、微妙に追加すると動作するようです。
偶奇判定が逆なのは単純ミスと思いますよ。

C++

1#include <iostream> 2#include <vector> 3using namespace std; 4 5class A 6{ 7public: 8 int a(vector<int>& x) ; 9}; 10 11class B :public A 12{ 13public: 14 int b(vector<int>& y); 15}; 16 17int A::a(vector<int>& x) 18{ 19 int m = 0; 20 m = x.capacity() / 2; 21 if(m * 2 == x.capacity()){return 0; } 22 else{return 1; } 23} 24 25int B::b(vector<int>& y) 26{ 27 if(!(a(y))){cout << "奇数\n";} /*この部分がうまく実行されません*/ 28 else{cout << "偶数\n";} 29 return 0; 30} 31 32int main(void) 33{ 34#if 0 35 A* aa=new A; 36 vector<int> a; 37 a->b(a); 38#else 39 B* b=new B; 40 vector<int> a; 41 b->b(a); 42#endif 43}

ところで、ソースは可能な時はコンパイルに通ったものを示すとスムーズですよ。
例えば、質問に記載されているソースは多少補った程度ではコンパイルできません。
aはvectorですので、当然b()関数はありません。
aa->b()のミスとしても、クラスAにb()関数はありません。
そのため、「実行しても関数aがちゃんと動きません。」と書かれても、実行できない筈なので回答できなくなります。

投稿2017/09/16 05:17

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/16 08:31

こんにちは、回答ありがとうございます。 "コンパイルに通ったものを示すと…" かくしておおまかな代替のソースを載せていました。 "クラスAにb()関数はありません"とは、実際は"#if 0" は通らないで"else"以降が実行されるという ことでしょうか?
Chironian

2017/09/16 09:08

> "コンパイルに通ったものを示すと…" > かくしておおまかな代替のソースを載せていました。 元のソースを開示する必要はありません。「おおまかな代替のソース」をコンパイルに通しておくとスムーズですよというお話です。ちょっとした手間を惜しまないことって意外に重要なのです。 > "クラスAにb()関数はありません"とは、 読んだままです。 もしかしてクラスAにb()関数を定義しているつもりでしょうか? もしそうなら質問に記載されているクラスAの定義を再確認すると良いと思います。 > 実際は"#if 0"は通らないで"else"以降が実行されるということでしょうか? roueさんが質問に書かれたコードとmaisumakunさんへのコメントに書かれたコードを載せているだけです。
退会済みユーザー

退会済みユーザー

2017/09/19 08:23

こんにちは 返信遅れてしまい申し訳ありません。 main中の"#if","else","end"は必要なのでしょうか? また、main中の"#if"等はmain中でコンパイラが優先的に 実行するものなのですか?
退会済みユーザー

退会済みユーザー

2017/09/19 08:41

こんにちは どうにかちゃんと動作してくれました。 単純ミスだったようです。(maisumakunさんQでミスがとれたようです。) "#if 0"へさせてもらった質問は気が向いたら返信ください。 どうもありがとうございました。
Chironian

2017/09/19 08:42

必要ではありません。「roueさんが質問に書かれたコードとmaisumakunさんへのコメントに書かれたコードを載せているだけです。」これ以上の意味は無いです。 > また、main中の"#if"等はmain中でコンパイラが優先的に実行するものなのですか? #if 0~#elseまでをコメントアウトしているのと同じです。 プリプロセッサについて調べるとよいと思います。http://ftc.suki.net/tpb/saruc09.html
退会済みユーザー

退会済みユーザー

2017/09/19 08:54

追記 static(?)かconstつければどうにかなると思っていました。 値のアクセスの問題と考えていました。(abort()というものから)
退会済みユーザー

退会済みユーザー

2017/09/19 09:02

"猿でもわかる…"そんなプログラミングのCDROM 兄が10年くらい前持っていた気がします…(関連は不明ですが) サイト、概観してみたのですが読みやすいです。 さっそく見てみます。
guest

0

C++の場合、基底クラスのポインタからの呼び出しで派生クラスのメソッドが呼ばれるようにするには、仮想メソッドである必要があります。

A::aの宣言をvirtual int a(vector<int>& x) ;のように書き換えて下さい。

投稿2017/09/16 04:05

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/16 04:15

回答ありがとうございます。 書き換えたのですが、"abort() has benn called " とDebug errorがでます。 またvirtualは実装部にも追加(二か所、ヘッダと実装部)ということ でしょうか?
maisumakun

2017/09/16 04:24

そして、A::bがないので、A* aaに対して「aa->b」は呼べません。
退会済みユーザー

退会済みユーザー

2017/09/16 04:32

実装部でvirtualのbを宣言(または書き換え 参照なしに)。 A::bとして。 ということでしょうか?(原始的かもしれませんが)
maisumakun

2017/09/16 04:36

さらにおかしいのですが、なぜAのインスタンスに対して、bメソッドを呼ぼうとしているのでしょうか(もちろん、無いメソッドは呼べません)
退会済みユーザー

退会済みユーザー

2017/09/16 04:40

B* b=new B; vector<int> a; b->b(a); --------------- ?
退会済みユーザー

退会済みユーザー

2017/09/16 04:42

class Bpubllic: A でアクセスできると思っていましたが、 仮想メソッド(virtual?)をつかうということですね。
退会済みユーザー

退会済みユーザー

2017/09/16 04:43

前々回はぶしつけなQ申し訳ありません。
退会済みユーザー

退会済みユーザー

2017/09/19 08:38

こんにちは 単純なミスで動作がおかしかったようです。 どうにかちゃんと動いてくれました。 ありがとうございました。 またよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問