【问题标题】:(C++) Passing a vector of objects to a constructor [closed](C ++)将对象向量传递给构造函数[关闭]
【发布时间】:2019-08-07 12:19:03
【问题描述】:
class A {
public:
   int value;
   A(int value){
       this->value = value;
   }
};

class Relation{
    vector<A> items;

    Relation(vector<A> items){
       this->items = items;
    }
}

int main(){
   vector<A> items;
   items.push_back(A(1));

   Relation r1(items);
}

如何将新对象的向量传递给另一个对象的构造函数?在第 13 行,我收到一个错误“没有匹配函数调用 'A::A()'”

【问题讨论】:

  • 第 13 行是哪一行?
  • 我没有收到那个错误。相反,我得到Relation::Relation 构造函数是私有的错误,这很容易修复。
  • 将Relation构造函数公开编译时没有错误
  • 显示的代码中缺少分号。即使忽略缺少的包含文件和缺少的命名空间声明,这也证明显示的代码不是真正的代码,在这里尝试猜测问题是什么,对每个人来说都是浪费时间。

标签: c++ object vector constructor


【解决方案1】:

关系的构造函数必须是公共的。此外,所有的“this->”都不是必需的。结局是这样的:

class A {
public:
   int value;

   A(int value)
   {
       value = value;
   }
};

class Relation{
    vector<A> items;

public:
    Relation(const vector<A>& values)
    {
       items = values;
    }
};

int main(){
   vector<A> items;
   items.push_back(A(1));

   Relation r1(items);
}

【讨论】:

    【解决方案2】:

    像这样:

    #include <vector>
    
    class A {
    public:
        int value;
        A(const int value1 = 0) : value(value1) {}
    };
    
    class Relation {
        std::vector<A> items;
    public:
        Relation(std::vector<A> items1) : items(items1) {};
        }
    };
    
    int main() {
        std::vector<A> items;
        items.push_back(A(1));
    
        Relation r1(items);
    }
    

    为了符合通常的 C++ 实践,进行了一些更改。最重要的可能是Relation 的构造函数暴露给public 使用。

    【讨论】:

    • 谢谢。但我也尝试将默认构造函数添加到不带参数的类“A”中,这也有帮助。
    • 我认为将items.push_back(A(1)) 更改为items.emplace_back(1) 比为A 类添加默认构造函数的侵入性更小。
    • @JoakimThorén 好点。将其添加为 answer 并在 cmets 中将我 ping 为“@thb”,以便系统通知我。我会投票。
    • @thb 再想一想,您的解决方案中实际上也需要默认构造函数。没有它它编译得很好。当然,使用emplace_back 无论如何都有它的好处,但在这种情况下它与默认构造函数(或OP提出的问题)没有任何关系。
    • @JoakimThorén 非常正确。不过,添加默认构造函数不会有什么坏处。 OP想尝试一下。听起来对他来说是个好习惯,所以我没有反对。
    【解决方案3】:

    我想这是因为类 Relation 中的元素目前是私有的,请尝试在任何声明之前添加public:。并在您的类声明后使用分号 (;) 以及在您的主函数中返回。

    【讨论】:

    • " 以及 main 函数中的 return" 不,没有必要。
    • 默认情况下 main 返回 0
    猜你喜欢
    • 2016-04-20
    • 2016-02-15
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2017-03-17
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多