创建类对象的方法

时间:2016-10-25 16:41:34

标签: c++

我想知道以下创建类对象的方法有什么区别。头文件是:

class NumberRange {
public:
    NumberRange(int a, int b);
    virtual ~NumberRange();
    void Print(int a, int b);
private:
    int *range_;
    int size;
};

.cc文件是:

#include <iostream>
#include "numberrange.h"
using namespace std;

NumberRange::NumberRange(int a, int b) {
    if (a > b) {
        cout << "a must be equal or less than b" << endl;
    }
}

NumberRange::~NumberRange() {

}

void NumberRange::Print(int a, int b) {
    this->size = b - a + 1;
    this->range_[0] = a;
    for (int i = 0; i < this->size; i++) {
        this->range_[i] = a + i;
        cout << this->range_[i] << endl;
    }
}

int main() {
    NumberRange * numberrange = new NumberRange(5, 9);
    numberrange->Print(5, 9);
}

当我使用指针创建对象并编译程序时。我收到错误[1] 20346 segmentation fault ./numberrange

但如果我将主要功能更改为:

int main() {
     NumberRange numberrange(5,9);
     numberrange.Print(5,9);
}

这将是有效的。因此,我不知道何时应该使用指针来创建对象。谢谢!

2 个答案:

答案 0 :(得分:3)

你的类中有一个指针range_,你没有在构造函数中初始化。然后在Print方法中使用它,在两种情况下都会导致UB。事实上,该程序在第二种情况下不会崩溃并不意味着您的程序是正确的。

答案 1 :(得分:1)

您的计划至少有三个问题。

第一个也是最明显的问题是int * range_是指向整数的指针,但并不指向任何特定的东西。它只包含一个随机存储器地址。 要更改它,请为其分配int数组,即使用new创建的数组,例如:

range_ = new int [b - a];

第二个不太明显的问题是你将a和b两次传递给你的对象,首先是在构造函数中,然后是在Print方法中(顺便说一下,最好不要大写方法)。 C ++中提供的++之一就是面向对象。物体有状态。如果希望NumberRange类的对象存储3到7之间的数字,请使用构造函数将它们存储为属性。无需在Print方法中再次传递该边界,它可以从属性中读取它们。

第三个,即使不那么明显的问题是,在你的例子中根本不需要存储数字,因为你只想打印它们。

问题二和三是相连的。可能你想用你的数字做更多的事情,而不仅仅是打印它们。所以让构造函数存储a和b,或者分配一个数组并存储从b到b的数字。后者效率较低,但可能在以后你想要存储不是整数的序列。