我不是C ++专家,但仍然没有很好的直观把握。我认为这是一个简单的问题。我无法将具有状态的对象传递给其他对象。我宁愿避免传递指针或引用,因为一旦设置了初始化对象,我就会在紧密循环中调用它们数百万次。我想我会像Command模式一样。这是问题的核心。我的标题代码类似于:
class ObjectWithState {
public:
ObjectWithState(int state) { // This constructor creates the problem!
state_ = state; // everyting works with no constructor.
}
private:
int state_;
};
class TakesObject {
public:
TakesObject(ObjectWithState obj) {
obj_ = obj;
}
private:
ObjectWithState obj_;
};
我的main()
功能如下:
int main () {
ObjectWithState some_object(1);
TakesObject takes_object(some_object);
return 0
}
我收到以下错误(g ++):
test.h: In constructor 'TakesObject::TakesObject(ObjectWithState)':
test.h:14: error: no matching function for call to 'ObjectWithState::ObjectWithState()'
test.h:5: note: candidates are: ObjectWithState::ObjectWithState(int)
test.h:3: note: ObjectWithState::ObjectWithState(const ObjectWithState&)
简单回答?
我不确定这是否与复制构造函数有关。如果是这样,我试图找到一个解决方案,使ObjectWithState的类定义非常干净和简短。该库的用户将定义许多小函数,如TakesObject函数将使用的函数。理想情况下,ObjectsWithState的程序员只需要专注于实现一个简单的对象。也许我会误入歧途......
答案 0 :(得分:5)
您可能想要做的是使用成员初始化语法:
class TakesObject {
public:
TakesObject(ObjectWithState obj): obj_(obj) {
}
private:
ObjectWithState obj_;
};
在您发布的代码中,TakesObject
构造函数将首先尝试使用默认构造函数构建新的ObjectWithState
,然后调用该作业运算符将传入的obj
复制到obj_
。上面的示例使用其复制构造函数直接构造obj_
。
您还需要为ObjectWithState
类定义一个复制构造函数:
class ObjectWithState {
public:
ObjectWithState(int state) {
state_ = state;
}
ObjectWithState(const ObjectWithState &rhs) {
state_ = rhs.state_;
}
private:
int state_;
};
如果省略类声明中的所有构造函数,则编译器会为您提供默认构造函数和复制构造函数。如果您声明任何构造函数,那么编译器提供 no 默认或复制构造函数,因此您必须实现自己的构造函数。
答案 1 :(得分:1)
您收到此错误是因为您声明了构造函数。仅当您未在类中声明构造函数时,编译器才会提供默认构造函数。因为您已声明了构造函数,所以不会获得默认构造函数。您必须显式声明不带参数的构造函数。