2014-06-20 37 views
-2

我得到這些結果:如何將結構傳遞給C++中的類?

constructor 
setFunc 
setFunc 

基本上我想要我的類對象全局和結構數組傳遞給類的使用setMethod。程序正在成功編譯,但沒有得到任何結果。

DataInput.h 

#ifndef DATAINPUT_H_ 
#define DATAINPUT_H_ 

#include <stdio.h> 

struct Data{ 
    const char *name; 
    int salary; 
    void set(int salary, const char *name){ 
     printf("setFunc \n"); 
     this->name = name; 
     this->salary = salary; 
    } 
}; 

這個類與上述頭文件seprate CPP文件

class DataInput { 
public: 
    int dataSize; 
    struct Data data[]; 

    DataInput(); 
    virtual ~DataInput(); 

    void setData(struct Data d[], int numberOfData); 
    void printData(); 

private: 

}; 

#endif 

------- EOF ---------- DataInput.cpp

#include "DataInput.h" 

DataInput::DataInput() { 
    printf("constructor \n"); 
    dataSize = 0; 
} 

DataInput::~DataInput() { 

} 

void DataInput :: setData(struct Data d[], int numberOfData){ 
    dataSize = numberOfData; 
    for (int i = 0; i< numberOfData; i++){ 
     printf("i-val in setData() --> %d",i); 
     this->data[i] = data[i]; 
    } 
} 

void DataInput::printData(){ 
    for (int i = 0; i< dataSize; i++){ 
     printf("name--> %s \n",data[i].name); 
     printf("salary--> %d \n",data[i].salary); 
    } 
} 

-------- EOF ----------- 的main.cpp

#include <stdlib.h> 
#include "DataInput.h" 
#include <stdio.h> 


DataInput *dataInput; 
int main(void) { 
    DataInput in; 
    dataInput = &in; 

    struct Data d[2]; 

    d[0].set(1000, "ABC"); 
    d[1].set(2000, "XYZ"); 

    dataInput->setData(d, 2); //not setting data 
    dataInput->printData(); //not printing 
    return 0; 
} 
+0

你的意思是將struct傳遞給一個類的函數嗎? –

+0

是的...我想要傳遞結構數組到類 – jpm

+0

這是行不通的。數據[]是一個空數組 - 它不能容納任何東西。 –

回答

0

對整個數組執行memcpy,只是分配數據可能導致內存泄漏堆棧幀刪除或刪除。這樣,但是你失去的記錄同時避免for循環提高性能

void DataInput :: setData(const struct Data const* d, const int numberOfData) { 
     // Cleanup old data! 
     if(this->data) delete [] this->data; 

     if(!d) throw new std::invalid_argument("Cannot set NULL data!"); // Remove this line if NULL may be assigned and replace with the commented code. 
     // if(!d) { 
     //  this->data = NULL; 
     //  this->dataSize = 0; 
     // } else { 
     this->data = new Data[(this->dataSize = numberOfData)]; 
     memcpy(this->data, d, sizeof(struct Data) * numberOfData); 
     // } 
} 

不要忘記更新DataInput中的類!

class DataInput { 
    public: 
     int dataSize; 
     struct Data* data; 

     DataInput(); 
     virtual ~DataInput(); 

     void setData(const struct Data const* d, const int numberOfData); 
     void printData(); 

    private: 
}; 

void DataInput::printData() { 
    for (int i = 0; i< this->dataSize; i++){ 
     printf("name--> %s \n",this->data[i].name); 
     printf("salary--> %d \n",this->data[i].salary); 
    } 
} 
DataInput::~DataInput() { 
    if(this->data) delete [] this->data; 
} 
1

注:可能無法編譯,只是說明

幾件事情:

DataInput構造的新項目沒有預留空間。所以,this->data[i] = data[i];結果是未定義的。

這是C++,三,字符串規則,....

struct Data 
{ 
    std::string name; 
    int salary; 

    Data(const std::string & n, int s); 
    Data & operator=(const Data & d); 
}; 

Data::Data(const std::string & n, int s) : 
    name(n), salary(s) 
{ 
} 

Data & Data::operator=(const Data & d) 
{ 
    name = d.name; 
    salary = d.salary; 
    return *this; 
} 

使用標準容器:

class DataInput 
{ 
    private: 
     std::vector<Data> data; 

    public: 
     DataInput(); 
     virtual ~DataInput(); 

     // you don't need use size 
     void setData(const std::vector<Data> & d); 
     void printData(); 
}; 

void DataInput::setData(const std::vector<Data> & d) 
{ 
    data = d; 
} 

void DataInput::printData() 
{ 
    for (std::vector<Data>::iterator it = data.begin(); it != data.end(); ++it) 
    { 
     std::cout << it->name << ":" << it->salary << std::endl; 
    } 
} 

現在,你可以用它從main(沒有指針):

int main(void) 
{ 
    DataInput in; 

    std::vector<Data> d; 

    d.push_back(Data(1000, "ABC")); 
    d.push_back(Data(2000, "XYZ")); 

    dataInput.setData(d); // yes setting data 
    dataInput.printData(); // yes printing 
    return 0; 
} 
+0

+1使用std :: vector ; !首先沒有想到它。 – MABVT

相關問題