在另一个对象类中创建实例

时间:2014-10-09 23:24:39

标签: c++ class pointers object instance

我需要在Crop of Class类中创建一个实例,我无法找到一种方法来实现这项工作。希望你们能帮上忙。

这是我的主要地方,我将一个对象发送到类作物。

int main(){

char select = 'a';
int plant_num = 2;
int crop_num = 0;

Crop crop[10];
Plant plant[20];

plant[0] = Plant("Carrots",'c');    
plant[1] = Plant("Lettuce",'l');
plant[2] = Plant("Rosemary",'r');

crop[0] = Crop(plant[0],4,2);
crop_num++;

cout << "Garden Designer" << endl;
cout << "===============";

}

类作物是我想要植物类实例的地方

class Crop {

private:
    int g_length;
    int w_width;
    Plant PlantType;

public:
    Crop();
    Crop(const Plant&, int, int);

};  

我想要类作物实例的类植物

class Plant {

private:
    char plant[20];
    char p_symbol;

public: 
    Plant();
    Plant(const char* n, char s);
};

Crop.cpp

#include <iostream>
#include <iomanip>
#include <cstring>
#include <new>
#include "crop.h"
using namespace std;


Crop::Crop(){



}

 Crop::Crop(const Plant& temp, int l, int w){



}
抱歉,如果我遗失了什么。真的很困惑,如果你需要Plant.cpp文件内容只是问我。我认为不需要该文件。

3 个答案:

答案 0 :(得分:6)

有一个名为Member initializer list的东西,它的位置在其参数列表之后的构造函数定义中,前面是分号,后跟构造函数的主体。因此,要初始化成员,您可以编写

Crop::Crop(const Plant& temp, int l, int w) : 
  g_length(l), 
  w_width(w), 
  PlantType(temp) 
{ }

这样做是为了调用成员的适当构造函数。他们不必是复制构造者。您可以显式调用默认值或其他任何值,但在您的情况下可能没有多大意义。

这是因为在执行构造函数体之前实例化成员。你不会遇到int的问题,因为它们可以在体内设置。但是,参考文献必须始终有效,因此身体内部没有任何内容可以使用&#34; null-reference&#34;。

你可以这样做:

Crop::Crop(const Plant& temp, int l, int w) : PlantType(temp) 
{ 
   g_length = l;
   w_width = w;
}

但是未明确初始化的任何成员都会使用默认构造函数进行初始化,因此//here g_lenght存在并且具有值(0或垃圾,如果默认值为零,则不记得,我认为它是捶打的,然后在身体operator=被召唤。在第一种情况下,通过复制构造函数创建对象。

通常这不是一个很大的区别,但对于更复杂的类型,它可能很重要。特别是如果构造一个空对象需要很长时间,那么赋值也很复杂。它只是为了更好地设置对象一次,而不是创建它并使用operator=重置。

出于某种原因,我个人喜欢第二种情况,但这被认为是一种更糟糕的做法,因为逻辑上这些成员是从一开始就使用某些值构建的。

答案 1 :(得分:1)

你在这里走上正轨:

crop[0] = Crop(plant[0],4,2);

这将使用正确的参数调用类Crop的构造函数。这个构造函数应该用这些值初始化相应的数据成员,但实际采用这些参数的构造函数什么都不做:

Crop::Crop(const Plant& temp, int l, int w) {
    // ...
}

使用成员初始值设定项列表初始化您的数据成员:

Crop::Crop(const Plant& temp, int l, int w)
    : g_length(l), g_width(w), PlantType(temp)
{ }

我们需要构建器主体,直到 我们已经初始化了我们的数据成员之后

答案 2 :(得分:0)

您的Crop构造函数接收Plant(和两个整数)并完全忽略它们。尝试:

Crop::Crop(const Plant& temp, int l, int w) :
    g_length(l), w_width(w), PlantType(temp) {}