2015-02-06 53 views
1

一类 我有一个公共的属性TissueCompartments:设置一个数组在构造函数中

class Diver { 
public: 
    TissueCompartments tissueCompartments[16]; 
    Diver(); 
    Diver(const Diver& orig, TissueCompartments tissueCompartments[16]); 
    virtual ~Diver(); 
}; 

和我有一个构造函数

Diver::Diver(const Diver& orig, TissueCompartments tissueCompartments[16]) { 
    this->tissueCompartments=tissueCompartments; 
} 

我得到这个错误: 错误:不兼容的类型'TissueCompartments *'分配给'TissueCompartments [16]'

回答

5

数组不可分配。难道这不是你的构造体:

#include <algorithm> 
//.. 
Diver::Diver(const Diver& orig, TissueCompartments* tC) 
{ 
    std::copy(tC, tC + 16, tissueCompartments); 
    //... 
} 

而且,请注意,此声明:

Diver::Diver(const Diver& orig, TissueCompartments tissueCompartments[16]) 

没有比这不同:

Diver::Diver(const Diver& orig, TissueCompartments* tissueCompartments) 

数组衰变为指针,甚至当您将[16]放入您的参数中时。所以[16]绝对没有影响(除了帮助让你知道它是一个16被引用的数组)。

另请注意,TissueCompartment类型在执行任何这些更改之前必须是可指定类型。

+1

我们希望'TissueCompartements'是可赋值的。 – Deduplicator 2015-02-06 19:49:42

+0

@Deduplicator - 是的,也是。这些类型必须是可分配的。 – PaulMcKenzie 2015-02-06 19:52:59

1

不能分配数组。另一件绊人的事实是函数不能按值取数组 - 编译器implicitly decays array arguments to pointers。如果你想要一个具有值语义的数组,使用std::array

class Diver { 
public: 
    std::array<TissueCompartments, 16> tissueCompartments; 
    Diver(); 
    Diver(const Diver& orig, std::array<TissueCompartments, 16> tissueCompartments); 
    virtual ~Diver(); 
}; 

Diver::Diver(const Diver& orig, std::array<TissueCompartments, 16> tissueCompartments) { 
    this->tissueCompartments=tissueCompartments; 
} 
+0

您更改的代码不必要地假定'TissueCompartments'是可分配的。 – Deduplicator 2015-02-06 19:55:32

1

尽管数组不可分配,但您可以使用括号初始值设定项轻松解决您的示例中的限制。
我使用的构造,委派和std::index_sequence由于建设性的懒惰:

#include <utility> 

template<size_t... i> Diver::Diver<i...>(const Diver& orig, 
     TissueCompartments tissueCompartments, std::index_sequence<i...>) 
    : tissueCompartments{tissueCompartments[i]...} 
{} 

Diver::Diver(const Diver& orig, TissueCompartments tissueCompartments[16]) 
    : Diver(orig, tissueCompartments, std::make_index_sequence(16) {} 

的助手是C++ 14,但只使用C++ 11的特性。

0

与涉及数组的任何问题一样,您的第一个想法应该是停止使用数组,并使用vector来代替。

#include <vector> 
class Diver { 
public: 
    std::vector<TissueCompartments> tissueCompartments; 
    Diver(); 
    Diver(const Diver& orig, std::vector<TissueCompartments> tissueCompartments); 
    virtual ~Diver(); 
}; 

那么你可以做:

Diver::Diver(const Diver& orig, std::vector<TissueCompartments> tissueCompartments) { 
    this->tissueCompartments=tissueCompartments; 
} 

,如果您正在使用C++ 11,你应该能够构造一个潜水员用初始化列表,假设潜水员构造由int和一个字符串组成:

Diver d{ {1,"hi"}, {2,"hi"}, {3,"hi"}, {4,"hi"} 
     , {5,"hi"}, {6,"hi"}, {7,"hi"}, {8,"hi"} 
     , {9,"hi"}, {10,"hi"}, {11,"hi"}, {12,"hi"} 
     , {13,"hi"}, {14,"hi"}, {15,"hi"}, {16,"hi"} 
     }; 
相关问题