2013-10-14 127 views
1

我是C++的新手。那么我有box.cpp和circle.cpp文件。在我解释我的问题,我想给你自己的定义:在其他类构造函数中初始化类对象

在box.cpp

class Box 
    { 
     private: 
     int area; 

     public: 
     Box(int area); 
     int getArea() const; 

    } 

在circle.cpp现在

#include "box.h" 
    class Circle 
    { 
     private: 
     int area; 
     Box box; 

     public: 
     Circle(int area, string str); 
     int getArea() const; 
     const Box& getBoxArea() const; 

    } 

,你可以在Circle类看我有一个整数值和Box对象。在Circle构造函数中,我很容易将该整数值分配给区域。

的一个问题是,我给出一个字符串,它分配给框对象

因此,我所做的圈构造内部是:

Circle :: Circle(int area, string str) 
{ 
    this->area = area; 
    // here I convert string to an integer value 
    // Lets say int_str; 
    // And later I assign that int_str to Box object like this: 
    Box box(int_str); 

} 

我的目的是访问这两个Circle区值和圆形对象面积值。 最后我写了函数const Box & getBoxArea()const;像这样:

const Box& getBoxArea() const 
    { 
     return this->box;  
    } 

因此我没有得到正确的值。我在这里错过了什么?

+0

您的代码甚至不应该编译。 'Box'需要一个默认的构造函数。请张贴一些现实的代码。 – juanchopanza

+0

[在另一个类对象中初始化一个对象(在对该构造函数进行一些操作之后)]的可能的重复。(http://stackoverflow.com/questions/19345054/initializing-a-object-in-an-another- class-object-after-doing-some-operations-o) – juanchopanza

回答

1

我建议写一个计算的基础上,输入字符串int一个非成员函数,然后用在Circle的构造函数初始化列表。

std::string foo(int area) { .... } 

然后

Circle :: Circle(int area, string str) : box(foo(str)) { .... } 

只能初始化在初始化列表中的非静态数据成员。一旦进入构造函数主体,所有内容都已初始化,并且您可以执行的所有操作都是对数据成员执行修改。因此,如果Box具有默认构造函数,那么将编译的代码的一个变体是

Circle :: Circle(int area, string str) : area(area) 
{ 
    // calculate int_str 
    .... 
    box = Box(int_str); 
} 
+0

你是什么意思的默认构造函数?我想我已经在第一个文件 – user2878007

+0

@ user2878007中有一个Box构造函数,你有一个构造函数'Box(int);'。默认的构造函数没有参数:'Box();' – juanchopanza

+0

嗯我明白了。我其实没有一个 – user2878007

3

Circle的构造函数中,您试图创建Box的实例,这个实例太晚了,因为在执行构造函数的主体时,Circle的成员应该已经构建。 Box要么类需要一个默认的构造函数,或者你需要一个初始化列表来初始化box

Box constructBoxFromStr(const std::string& str) { 
    int i; 
    ... 
    return Box(i); 
} 

class Circle 
{ 
private: 
    int area; 
    Box box; 

public: 
    Circle(int area, string str) 
     : area(area), box(constructBoxFromStr(str)) { } 
    ... 
} 
+0

我看到了,但问题是我没有默认构造函数 – user2878007

+0

@ user2878007:我指出的解决方案不需要默认构造函数。 – LihO

相关问题