我输出2个类的问题如下:
foo.h中
public:
Foo(){} ;
Foo(string);
Foo(const Foo&);
string getFooName() const;
~Foo();
private:
string foo;
Foo.cpp中
Foo::Foo(string n):foo(n){
}
Foo::Foo(const Foo &f):foo(f.foo){
}
string Foo::getFooName() const{
return foo;
}
Foo::~Foo(){
}
和班级栏:
Bar.h
public:
Bar();
Bar(string, Foo&);
Bar(const Bar&);
Foo& getFoo() const;
~Bar();
private:
string bar;
Foo* foo;
};
Bar.cpp
Bar::Bar(string b, Foo &f):bar(b), foo(new Foo()){
}
Bar::Bar(const Bar &b):bar(b.bar), foo(new Foo(*b.foo)){
}
Foo &Bar::getFoo() const{
return *foo;
}
Bar::~Bar()
{
delete foo;
}
并且在主要功能中,当我使用此cout<<"Test:"<<b->getFoo().getFooName();
时,它仅使我输出Test:
而不是Test:TestFoo
。
我的代码有什么问题? (gcc5.4.0,cmake 3.5.1) TNX
和main.cpp
Foo* f;
Bar* b;
f=new Foo("TestFoo");
b=new Bar("TestBar",*f);
cout<<"Test:"<<b->getFoo().getFooName(); // this line
答案 0 :(得分:4)
Bar::Bar(string b, Foo &f):bar(b), foo(new Foo()){}
参数f
未使用。您需要将其传递给Foo
构造函数。
Bar::Bar(string b, Foo &f):bar(b), foo(new Foo(f)){}
答案 1 :(得分:1)
致电时
b = new Bar("TestBar", *f);
调用以下构造函数:
Bar::Bar(string b, Foo &f):bar(b), foo(new Foo())
如您所见,第二个参数不用于初始化foo成员,而是创建一个新成员。它与您使用“TestFoo”初始化的对象不同!
因此,当您打印时,根本不会返回“TestFoo”。
答案 2 :(得分:1)
问题在于Bar.cpp
:
Bar
的第一个构造函数是
Bar::Bar(string b, Foo &f):bar(b), foo(new Foo()){
}
这告诉编译器创建一个指向要存储在Foo
对象中的新Bar
对象的指针。但是,新的Foo
对象与作为构造函数的输入传递的Foo
对象无关。构造函数需要使用作为输入传递的Foo
对象,以便新的Foo
对象在成员变量foo
中具有相同的值:
Bar::Bar(string b, Foo &f):bar(b), foo(new Foo(f.foo)){
}
然后,构造函数调用
b=new Bar("TestBar",*f);
main.cpp
中的实际上会为成员变量foo
分配一个“TestFoo”值(而在它没有初始化变量之前)。
因此,b->getFoo().getFooName()
应根据需要返回“TestFoo”。