c++ - 如何在不将参数传递给其构造函数的情况下声明类的对象?

标签 c++

我有一个类,它的构造函数有一个参数。现在我必须声明 A 类对象。但是我需要稍后调用构造函数。但如果我这样做,我会收到错误消息。

例如

class A{
        public:
        int a;
        A(int x){
                a=x;
        }
};
int main(){
        A a;
        a=A(3);
}

错误

temp.cpp: In function ‘int main()’:
temp.cpp:10:4: error: no matching function for call to ‘A::A()’
temp.cpp:10:4: note: candidates are:
temp.cpp:5:2: note: A::A(int)
temp.cpp:5:2: note:   candidate expects 1 argument, 0 provided
temp.cpp:3:7: note: A::A(const A&)
temp.cpp:3:7: note:   candidate expects 1 argument, 0 provided

最佳答案

这里唯一好的解决方案是首先避免这种情况的发生。

这种情况通常发生在当你有一些东西必须创建一个对象的一般顺序时,它的初始值取决于某些条件,所以从概念上讲你想要的是这个一般顺序的东西:

if (xyz)
    A a(123);
else
    A a(456);

// code that uses A goes here

这种情况下的问题是,在这种情况下,A 在您可以使用它之前就超出了范围。解决方法通常是将这段代码分成两个函数,所以你最终会得到这样的东西:

if (xyz)
    code_that_uses_A(123);
else
    code_that_uses_A(456);

虽然我当然更愿意避免它,但还有另一种可能 可行:一个包装器对象,它跟踪它包含的对象是否已被初始化。例如,它可以包含指向实际对象的指针。这被初始化为一个空指针。当您初始化它包含的对象时,您分配了一个包含的对象。根据您的需要,尝试重新初始化容器对象可能会抛出异常,也可能只是为包含的对象分配一个新值。

在这两者中,前者几乎总是更可取。它倾向于清理代码并赋予每个单独的代码片段单一、明确的职责。后者可以工作,但通常需要相当多的工作才能让包装器对象呈现一个干净的接口(interface)。虽然我通常认为它不是一个问题,但这样的包装器通常会增加使用包装对象的大量开销。

关于c++ - 如何在不将参数传递给其构造函数的情况下声明类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24756082/

相关文章:

c++ - 对 std::optional 使用 std::iter_swap

c++ - 仅在声明定义时检查 vector/数组边界

c++ - 使用 C++ 解析 HTML(最好使用 Qt)

c++ - 在广播套接字中发送私有(private) UDP 消息

java - OpenMP 不能与 JNI 并行运行

c++ - for循环的初始化和增量部分中的逗号如何工作?

c++ - 双数据类型的解释错误

c++ - 如何将 unsigned char[] 转换为 std::vector<unsigned char>

c++ - 绕过 Boost Multi-Index 容器的常量元素

c++ - 隐式转换为动态分配数组的 const