如何使用带参数的构造函数在C ++中声明具有来自另一个类的类数据的对象

时间:2013-07-08 13:31:31

标签: c++ class object constructor

我正在创建一个简单的对象......但是

我找不到一种“语义方式”来创建一个具有类作为数据的构造函数的对象,所以我无法创建我的对象,即:

#include <iostream>

using namespace std;

class Coordinate
{
public:
    Coordinate(int axisX,int axisY) {
        x= axisX;
        y= axisY;
    }
    int x,y;
};

class Point
{
public:
    string color;
    Coordinate coordinate;
};

int main()
{

    Point myPoint; //Error here also tried Point myPoint(1,1) or myPoint::Coordenate(1,1) etc...

    return 0;
}

3 个答案:

答案 0 :(得分:3)

您必须为Point提供构造函数,以便适当地初始化coordinate成员:

class Point
{
  //make data members private!
  string color;
  Coordinate coordinate;
public:
  Point()
    : color("red")     //initialize color
    , coordinate(4,13) //initialize coordinate
  {}

  // and/or:
  Point(int x, int y, std::string clr = "")
    : color(clr)
    , coordinate(x,y)
  {}
};

您可能想要查找构造函数初始化列表(冒号和左大括号之间的部分),因为它们可能对您来说是新手。您的Coordinate构造函数也可以从初始化列表中受益:

class Coordinate
{
public:
   Coordinate(int axisX,int axisY) 
     : x(axisX), y(axisY)
   {}

private:
  //again, data members should be private in most cases
  int x,y;
};

答案 1 :(得分:1)

在你的情况下,你需要在Point的构造函数中使用初始化列表,以便使用你定义的转换构造函数构造Coordinate

class Point
{
public:
  Point()
  :
    coordinate (42, 42) // you would somehow pass these to Point's constructor
  {
  }
};

原因是因为Coordinate没有默认构造函数(例如,可以不带参数调用的构造函数)。通常,如果您没有定义默认构造函数,编译器将为您编写一个,但如果您定义任何其他构造函数,则不会发生这种情况。

您还可以通过指定默认参数来修改已编写为默认构造函数的转换构造函数:

Coordinate(int axisX = 42, int axisY = 42) {
  x = axisX;
  y = axisY;
}

但是我不确定你的程序在语义上是否有意义。

您还可以为Coordinate实现默认构造函数:

class Coordinate
{
public:
  Coordinate ()
  :
    x (0) ,
    y (0)
  { 
  }
  // ...
};

但是你遇到了一个问题,你可能会在Coordinatex中使用有效但无意义的值来实例化y对象。

可能最好的方法是我建议的第一个方法,进行修改以便将坐标传递给Point的构造函数:

class Point
{
public:
  Point (int x, int y)
  :
    coordinate (x, y)
  {
  }
};

这将如此构建:

int main()
{
  Point p(1,2);
}

现在无法使用无效或无意义的Point实例化Coordinate对象。

答案 2 :(得分:-3)

class Point
{
public:
point(int axisX,int axisY):Coordinate(axisX,axisY);
string color;
Coordinate coordinate;
};