2012-10-23 24 views
0

主類創建運行輪胎類的實例。輪胎類別調用成員函數bool tire<TypeTire, TypeNode>::add_node(TypeTire const& input_data)以便通過node_root_vec.push_back(node_data);將所有字符「ABCDEFAB」推送到矢量。 node_data創建node_data = new node_tire<TypeTire, TypeNode>();之前推向量。成員函數中的結構不能爲其新地址

#include <iostream> 
#include <string> 
#include <vector> 
using namespace boost; 

template<typename TypeTire, typename TypeNode> 
struct node_tire { 
    // data in node 
    TypeNode const *data; 

    int addr_node; 
    // address insert next node 
    std::vector<node_tire<TypeTire, TypeNode> > addr_next_node; 
    // address insert pervious node 
    std::vector<node_tire<TypeTire, TypeNode> > addr_prve_node; 
    // insert data to node 
    node_tire() : data(NULL) { } 
}; 


template<typename TypeTire, typename TypeNode> 
class tire 
{ 
    public: 
     tire(); 
     node_tire<TypeTire, TypeNode> *check_node(node_tire<TypeTire, TypeNode>& node); 
     bool add_node(TypeTire const& data); 

    private: 

     node_tire<TypeTire, TypeNode> *node_data; 
     std::vector<node_tire<TypeTire, TypeNode>* > node_root_vec; 

     // handling node 
     std::vector<shared_ptr<node_tire<TypeTire, TypeNode> > > node_root_shared_ptr; 
     typedef shared_ptr<node_tire<TypeTire, TypeNode> > node_ptr; 

}; 

template<typename TypeTire, typename TypeNode> 
tire<TypeTire, TypeNode>::tire() 
{ 

} 

// Finding data in root node before travelling in branch. 
template<typename TypeTire, typename TypeNode> 
node_tire<TypeTire, TypeNode> *tire<TypeTire, TypeNode>::check_node(node_tire<TypeTire, TypeNode>& node) 
{ 
    int index_root_node = 0; 

    for(typename std::vector<node_tire<TypeTire, TypeNode>* >::iterator iter_root = node_root_vec.begin(); 
      iter_root != node_root_vec.end(); 
      ++iter_root, ++index_root_node) { 
     node_tire<TypeTire, TypeNode> *node_in_vec = *iter_root; 
     TypeNode const *data = node_in_vec->data; 

     std::cout<<" Compare : " << *data << " : " << *node.data <<", Data address : " << &data <<std::endl; 

     if(*data == *node.data) { 
      node_tire<TypeTire, TypeNode> *node_in_root = node_root_vec[index_root_node]; 
      std::cout<<"Address fond node in root : " << &node_root_vec[index_root_node] <<", value : " << node_in_root->data <<std::endl; 
      return node_root_vec[index_root_node]; 

     } 

    } 

    return NULL; 
} 

template<typename TypeTire, typename TypeNode> 
bool tire<TypeTire, TypeNode>::add_node(TypeTire const& input_data) 
{ 
    int index_input = 0; 

    for(typename TypeTire::const_iterator iter_input = input_data.begin(); iter_input != input_data.end(); ++iter_input, ++index_input) { 

     node_data = new node_tire<TypeTire, TypeNode>(); 
     node_data->data = &(*iter_input); 
     std::cout<<" Node Address : " << &node_data <<std::endl; 

     // Found data in root node in condition else. 
     // Not found in root node to if. 
     if(check_node(*node_data) == NULL) { 
      node_root_vec.push_back(node_data); 
     } 

    } 

} 

// mian.cpp 
int main() 
{ 
tire<std::string, char> tire_node; 
std::string str_test = "ABCDEFAB"; 
tire_node.add_node(str_test); 
} 

我從矢量打印node_data版本的地址,它應該的node_data新的地址,但只顯示舊地址後node_data = new node_tire<TypeTire, TypeNode>();創建。爲什麼不能新地址node_data

Node Address : 0x7fff0ebb28b0 
Node Address : 0x7fff0ebb28b0 
Compare : A : B, Data address : 0x7fff0ebb2760 
Node Address : 0x7fff0ebb28b0 
Compare : A : C, Data address : 0x7fff0ebb2760 
Compare : B : C, Data address : 0x7fff0ebb2760 
Node Address : 0x7fff0ebb28b0 
Compare : A : D, Data address : 0x7fff0ebb2760 
Compare : B : D, Data address : 0x7fff0ebb2760 
Compare : C : D, Data address : 0x7fff0ebb2760 
Node Address : 0x7fff0ebb28b0 
Compare : A : E, Data address : 0x7fff0ebb2760 
Compare : B : E, Data address : 0x7fff0ebb2760 
Compare : C : E, Data address : 0x7fff0ebb2760 
Compare : D : E, Data address : 0x7fff0ebb2760 
Node Address : 0x7fff0ebb28b0 
Compare : A : F, Data address : 0x7fff0ebb2760 
Compare : B : F, Data address : 0x7fff0ebb2760 
Compare : C : F, Data address : 0x7fff0ebb2760 
Compare : D : F, Data address : 0x7fff0ebb2760 
Compare : E : F, Data address : 0x7fff0ebb2760 
Node Address : 0x7fff0ebb28b0 

回答

0

見我的代碼,並且可以得到你趕緊錯誤:

void test() { 
    int n; 
    for(int i = 0; i < 100; i++) { 
     n = i + 2; 
     std::cout << "Address of n is: " << &n << std::endl; 
    } 
} 

你認爲我的程序的輸出應該改變?我更改n的值,但我無法更改其地址,可以嗎?
正如你的情況,你正在改變node_data的值,但你永遠不能改變地址node_data。你可以嗎?而你正在打印的是地址node_data而不是它的值。

0

您正在打印& node_data,它是node_data成員的地址,它是輪胎對象地址的常量偏移量。

已分配實例的地址是node_data(您新建的那個)

相關問題