【问题标题】:Why can't I use a class object as a parameter为什么我不能使用类对象作为参数
【发布时间】:2018-11-25 00:23:24
【问题描述】:

让类作为另一个类构造函数的参数传递时,我遇到了这个问题。基本上代码是这样的:

class A
{
    public:
       int ID;
       A(int getID)
       {
           ID = getID;
       }
}

我想像这样使用 A 类作为 B 类的成员:

class B
{
    public:
        A someA;
        A someB;
        int number;

    B(A ObjectA, A ObjectB, int getNumber)
    {
        someA = ObjectA;
        someB = ObjectB;
        number = getNumber;
    }
};

错误基本上是说没有匹配的函数可以调用B::B()。我不知道它有什么问题。我用对象的向量做了类似的事情,所以我想为什么这个东西不能工作。感谢您的任何输入/更正,谢谢!

旁注:我已尝试按照另一个线程中的建议为B 添加默认构造函数,但它最终显示B::B 的使用无效。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请花点时间浏览The Tour,并参考Help Center 的材料,了解您可以在这里询问什么以及如何询问。特别重要的是发一个minimal reproducible example
  • 请说明您如何实例化B 类型的对象。
  • 对你的问题有太多可能的解释,而你没有提供足够的信息。提供minimal reproducible example 将帮助人们帮助您。如果编译器在编译类B 时没有类A 的可见性——这将是一种解释。在发出您描述的错误消息之前,编译器会针对这种情况发出大量错误消息。
  • 啊,麻烦您了。我将完全相同的代码复制粘贴到我的 linux 机器上(使用的是 windows),不知何故它工作得很好。没有任何错误。

标签: c++ class object constructor


【解决方案1】:

为您的对象使用初始化列表:

B(A ObjectA, A ObjectB, int getNumber)
:someA(std::move(ObjectA)), someB(std::move(ObjectB)), number(getNumber)
{
}

这将使用您类中的默认移动构造函数。

我在这里使用了move,因为你通过值传递你的对象,所以移动它们是有意义的。如果您通过 const& 传递它们,则不要移动它们并使用默认的复制构造函数。

不过,这与A 默认构造函数有关,您显示的代码中的B 默认构造函数没有问题。

【讨论】:

    【解决方案2】:

    发生错误是因为你没有告诉B如何初始化它的A属性,所以它正在寻找默认的A构造函数。

    在 C++ 中,属性初始化是由 Matthieu 展示的,而不是在构造函数的主体中。您可以添加一个默认的 A 构造函数,但您必须考虑它是否是您想要的代码行为。

    编译下面的代码没有任何错误。

    class A {
    public:
        int ID;
    
        A() {}
    
        A(int getID) {
            ID = getID;
        }
    };
    
    class B {
    public:
        A someA;
        A someB;
        int number;
    
        B() {}
    
        B(A ObjectA, A ObjectB, int getNumber) {
            someA = ObjectA;
            someB = ObjectB;
            number = getNumber;
        }
    };
    

    【讨论】:

    • 添加默认构造函数一般可能无关紧要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2015-02-14
    • 1970-01-01
    • 2014-01-15
    • 2020-01-26
    相关资源
    最近更新 更多