好吧,我刚刚在.C
文件的开头开始测试。这样的短线并没有真正解决问题所在。我创建了一个类,我将数据成员Class
和double* 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
发生了什么?
答案 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)
您的会员a
和b
未初始化(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关键字总是会创建一个指向该对象的非零指针。谢谢