无意义的实例化

时间:2014-12-29 15:12:26

标签: c++ class instantiation

好吧,我刚刚在.C文件的开头开始测试。这样的短线并没有真正解决问题所在。我创建了一个类,我将数据成员Classdouble* a命名为double* b。我还创建了一个构造函数,我在其中设置了数据成员。但这似乎不起作用。出于某种原因,a设置了应该转到b的值。

所以,这是我的(短 - 短).h文件:

class myclass 
{
 public:
  myclass (double*, double*);

 private:
  //data members
  double*  a;
  double*  b;

};

这是.C

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

myclass::myclass (double* inputa, double* inputb)
{
  cout << endl << endl <<  "Before instanciating"<< endl;
  for (int i = 0; i<3; ++i)
    cout << "inputa[" << i << "]= " << inputa[i] << endl;
  for (int i = 0; i<3; ++i)
    cout << "inputb[" << i << "]= " << inputb[i] << endl;

  cout << endl << endl << "While instanciating..." << endl;
  for(int i = 0; i<3 ;++i)
    {
      a[i] = inputa[i]; cout << "a[" << i << "]= " << a[i] << endl;
      b[i] = inputb[i]; cout << "b[" << i << "]= " << b[i] << endl;
    }

  cout << endl << endl << "New class object created!" << endl;
  for (int i = 0; i<3; ++i)
    cout << "a[" << i << "]= " << a[i] << endl;
  for (int i = 0; i<3; ++i)
    cout << "b[" << i << "]= " << b[i] << endl;
}

int main()
{
  double a [3];
  a[0] = a[2] = 1;
  a[1] = 0;
  double b [3];
  b[0] = b[1] = 0;
  b[2] = 2;
  cout << endl << endl << "Before creating object" << endl;
  for (int i = 0; i<3; ++i)
    cout << "a[" << i << "]= " << a[i] << endl;
  for (int i = 0; i<3; ++i)
    cout << "b[" << i << "]= " << b[i] << endl;
  myclass* obj = new myclass (a, b);


  return 0;
}

当我运行这段代码时,输​​出是:

Before creating object a[0]= 1 a[1]= 0 a[2]= 1 b[0]= 0 b[1]= 0 b[2]= 2
Before instanciating inputa[0]= 1 inputa[1]= 0 inputa[2]= 1 inputb[0]= 0 inputb[1]= 0 inputb[2]= 2
While instanciating... a[0]= 1 b[0]= 0 a[1]= 0 b[1]= 0 a[2]= 1 b[2]= 2
New class object created! a[0]= 0 a[1]= 0 a[2]= 2 b[0]= 0 b[1]= 0 b[2]= 2

重新格式化输出以使其更容易阅读(不完全是代码的输出;添加了额外的空格):

Before creating object
    a[0]= 1
    a[1]= 0
    a[2]= 1
    b[0]= 0
    b[1]= 0
    b[2]= 2
Before instanciating
    inputa[0]= 1
    inputa[1]= 0
    inputa[2]= 1
    inputb[0]= 0
    inputb[1]= 0
    inputb[2]= 2
While instanciating...
    a[0]= 1
    b[0]= 0
    a[1]= 0
    b[1]= 0
    a[2]= 1
    b[2]= 2
New class object created!
    a[0]= 0
    a[1]= 0
    a[2]= 2
    b[0]= 0
    b[1]= 0
    b[2]= 2

发生了什么?

3 个答案:

答案 0 :(得分:1)

你应该避免在你的课程中使用原始指针。它还建议使用STL容器作为std :: array(C ++ 11)如果您在编译时知道数组或std :: vector的大小,如果您希望您的表将动态增长并且在此case将所有内存管理委托给你的stl容器。

您的类Class的可能实现可能如下所示:

1-如果您知道阵列需要多大的尺寸:

class myclass 
{
 public:
  explicit myclass (const std::array<double,3>& arr1, const std::array<double,3>& arr2) 
 {
  arrayOfDouble1_ = arr1;
  arrayOfDouble2_ = arr2;
 }

 private:
  //data members
  std::array<double,3> arrayOfDouble1_;
  std::array<double,3> arrayOfDouble2_;

};

2-如果你使用std :: vector&lt;&gt;

class myclass 
{
  public:
  explicit myclass (const std::vector<double>& v1, const std::vector<double>& v2) 
  {
      vectorOfDouble1_(v1);
      vectorOfDouble2_(v2);
  }

 private:
  //data members
  std::vector<double> vectorOfDouble1_
  std::vector<double> vectorOfDouble2_;

};



int main()
{
  // Array use
  std::array<double,3> arrayOfDouble1 = {1, 0, 1};
  std::array<double,3> arrayOfDouble2 = {0, 0, 2};
  myclass mC(arrayOfDouble1, arrayOfDouble2);

 // vector use
  std::vector<double> vectorOfDouble1{1, 0, 1}; //C++11 initialization
  std::vector<double> vectorOfDouble2{0, 0, 2}; //C++11 initialization
  myclass mC(vectorOfDouble1, vectorOfDouble2);    

  return 0;
}

答案 1 :(得分:0)

您的会员ab未初始化(new double[3])。 所以你的做法a[i] =是未定义的行为。

使用double a[3];std::vector<double> a;std::array<double, 3> a;

会更安全/更清洁

答案 2 :(得分:0)

只需将myclass.h中a和b的实例化更改为相应的数组?

class myclass 
{
 public:
  myclass (double*, double*);

 private:
  //you tried to assign array element value to following variable a and b 
    double  a[3];
    double  b[3];

};

或者

而是分配数组,但在myclass :: myclass()中指定指针值?

//remain old declaration in header file
double*  a;
double*  b;

//but in source file 
a[i] = inputa[i]; 
b[i] = inputb[i];

替换为

a = inputa;
b = inputb;

myclass中的 a 双重类型的指针。 因此,您无法将其与数组相等,但您可以将其等于另一个指针的double。 ^^ 在相同类型的指针值相等之后,这意味着您让两个指针指向同一个对象。

顺便说一句,我学到了一些东西,C ++中的new关键字总是会创建一个指向该对象的非零指针。谢谢