类内的结构

时间:2010-06-09 17:08:53

标签: c++

我有一个表格的类定义

class X
{
  public:
     //class functions
  private:
      A_type *A;
      //other class variables
};

和struct A_type定义为

struct A_type
{ 
  string s1,s2,s3;
};

在构造函数中,我为A分配适当的内存并尝试A [0] .s1 =“somestring”; 它显示了分段错误。 这种声明是无效的,还是我遗漏了什么

编辑:OP的新代码已从评论[neilb]

移出
#include <stdio.h> 
#include <math.h> 
#include <string> 
#include <iostream> 
using namespace std; 

struct HMMStruct { string a; }; 

HMMStruct *HMMs; 

int main() { 
    HMMs=(HMMStruct*)malloc(sizeof(HMMStruct)*2); 
    HMMs[0].a="sdfasasdsdfg"; 
    cout << HMMs[0].a << endl; 
} 

5 个答案:

答案 0 :(得分:3)

为什么不:

class X
{
  public:
     //class functions
  private:
      A_type a;
};

换句话说,为什么动态分配A_type实例?

编辑:您发布的新代码的问题在于它使用了malloc()。如果使用malloc(),则不会调用构造函数,这对于像POD这样的非POD类型是必不可少的。您不应该在C ++程序中使用malloc - 所有内容都应该使用new来分配,这将正确地调用构造函数:

HMMs= new HMMStruct[2]; 

你的代码并不真正适用于char *成员 - 它显然不会失败。

答案 1 :(得分:1)

'分配内存'是什么意思?你不得不说'新A_type'。如果你只是调用malloc,那么构造函数将不会运行,并且赋值将不起作用。

答案 2 :(得分:1)

  

在构造函数中,我为A分配适当的内存并尝试A [0] .s1 =“somestring”;它显示了分段错误。这种声明是无效的,还是我遗漏了什么

你的错误可能在你没有发布的代码中,这是为你的内存分配A。

或许你有超过1个构造函数而你没有在其中一个构造函数中分配内存。

答案 3 :(得分:0)

因为你是C ++,所以使用std :: vector而不是数组。然后问题就会消失。 有些东西:

#include <vector>
#include <string>
using std::string;
using std::vector;

struct A_type
{
    string s1,s2,s3;
    A_type(string str1,string str2, string str3): s1(str1), s2(str2), s3(str3) {};
};
class X
{
public:
    X();
private:
    vector<A_type> A;
};
X::X()
:   A(vector<A_type>())
{
    A.push_back(A_type("something","or","other"));
    //...
    // Access vector items by A[index] or better A.at(index)
}

更好的C ++恕我直言。

答案 4 :(得分:0)

问题是您使用的是malloc而不是new。 Malloc只分配原始字节,new为对象分配内存,并调用该对象的构造函数。基本上你留下了一个带有未初始化值的类/结构。在您的情况下,字符串尚未初始化,因此尝试使用它会导致seg错误。这就是你想要的:

#include <stdio.h> 
#include <math.h> 
#include <string> 
#include <iostream> 
using namespace std; 

struct HMMStruct { string a; }; 

HMMStruct *HMMs; 

int main() { 
    HMMs = new HMMStruct[2];
    HMMs[0].a="sdfasasdsdfg"; 
    cout << HMMs[0].a << endl; 
    delete [] HMMs; // don't forget to delete.
}