2017-08-15 14 views
-2

こんにちは、私は完璧に動作し、このコードを持っている:私は引数を送信するために行うことができますどのように

main.cppに:

#include <iostream> 
#include "class1.hpp" 

int main(){ 
    Class1 class1; 
    return EXIT_SUCCESS; 
} 

class1.cpp

#include <iostream> 
#include "class1.hpp" 

Class1 :: Class1(){ 

class2; 
} 

class1.hpp

#ifndef DEF_CLASS1 
#define DEF_CLASS1 

#include "class2.hpp" 

class Class1{ 

public: 
    Class1(); 
    Class2 class2; 
}; 

#endif 

class2.cpp:

#include <iostream> 
#include "class2.hpp" 

Class2 :: Class2(){ 
    std::cout << "Test OK1" << std::endl; 
} 

class2.hpp:

#ifndef DEF_CLASS2 
#define DEF_CLASS2 

class Class2{ 
public: 
    Class2(); 
}; 

#endif 
私はコンパイル

と私はそれは大丈夫ですので、私は "テストOK1" を取得するコードを実行します。今、私はこのようなクラス2への議論を入れたいと思いますclass2(std::string a)残念なことに、成功なしで多くのことを試したので、どうしたらいいですか?

+1

コンストラクタ 'Class1 :: Class1()'は何とか変わっています。その本体では、エフェクトレスの式 'class2;'があります。これは構文的には正しいですが、メンバーClass1 :: class2をこのように構築しようとしているのであれば、うーん... C++の本をもう一度見てください... – Scheff

+0

これを解決する解決策はありますか? –

+0

など。 'Class1 :: Class1():class2(){}'は、メンバ 'Class1 :: class2'のデフォルトコンストラクタを呼び出します。あなたのコードにあるように、これは暗黙のうちに行われます。引数を持つように 'Class2'のコンストラクタを変更すると、あなたのコードはもうコンパイルされません...(Btw。本のヒントは真剣に意味されていました) – Scheff

答えて

0

私は引数を取得するためにClass2のコンストラクタを変更:

#include <iostream> 

using namespace std; 

class Class2 { 
    public: 
    Class2(const char *text); 
}; 

Class2::Class2(const char *text) 
{ 
    cout << "Class2::Class2(\"" << text << "\");" << endl; 
} 

class Class1 { 
    public: 
    Class1(); 
    Class2 class2; 
}; 

Class1::Class1() 
{ 
    //class2; // <-- correct but without any effect 
} 

int main() 
{ 
    Class1 class1; 
    return 0; 
} 

++グラムしてコンパイル:

$ g++ -std=c++11 -o test test.cc 
test.cc: In constructor 'Class1::Class1()': 
test.cc:21:16: error: no matching function for call to 'Class2::Class2()' 
Class1::Class1() 
       ^
test.cc:10:1: note: candidate: Class2::Class2(const char*) 
Class2::Class2(const char *text) 
^ 
test.cc:10:1: note: candidate expects 1 argument, 0 provided 
test.cc:5:7: note: candidate: constexpr Class2::Class2(const Class2&) 
class Class2 { 
    ^
test.cc:5:7: note: candidate expects 1 argument, 0 provided 
test.cc:5:7: note: candidate: constexpr Class2::Class2(Class2&&) 
test.cc:5:7: note: candidate expects 1 argument, 0 provided 

それはClass1::class2ためClass2のデフォルトコンストラクタを適用することができないため、コンパイラは文句を言います。 Class2::Class2()の署名をClass2::Class2(const char*)に変更すると、明示的な構成が必要になります。

したがって、私は、コンストラクタClass1::Class1を変更し、Class1::class2の明示的な工事を追加します。

Class1::Class1(): 
    class2("Hello Class1") 
{ 
    //class2; // <-- correct but without any effect 
} 

コンパイルをもう一度:

$ g++ -std=c++11 -o test test.cc 

$ ./test 
Class2::Class2("Hello Class1"); 

$ 

は今、それをコンパイルし、それが動作します。

+0

おめでとう!大いに感謝する !あなたは私の日を救う!!!!!!! –

関連する問題