2010-04-09 45 views
0
//file list.h 
#include "stdafx.h" 

namespace st 
{ 
    struct My_List; 
    typedef My_List list; 
    list* create(const char* name); 
} 

//file list.cpp 
#include "stdafx.h" 
#include "list.h" 
namespace st 
{ 
    struct My_List 
    { 
     const char* name_; 
     My_List* left_; 
     My_List* right_; 

     My_List(const char* name):name_(name), 
      left_(nullptr), 
      right_(nullptr) 
     {} 
     My_List(const My_List&); 

     ~My_List() 
     { 

     } 
     void insert(My_List*); 

     void set_name(char* name) 
     { 

      name_ = name; 
     } 

     const char* get_name()const 
     { 
      return name_; 
     } 
    }; 
    typedef My_List list; 

    /*helper class for optor+ */ 
    struct MyChar 
    { 
     const char* my_data_; 
     MyChar(const char* c_string):my_data_(c_string){} 
     operator const char*() 
     { 
      return my_data_; 
     } 
     operator char*() 
     { 
      return const_cast<char*>(my_data_); 
     } 

    }; 

    char* operator+(MyChar left_, MyChar right_) 
    { 
     if (!left_.my_data_ || !right_.my_data_) 
     { 
      return 0; 
     } 
     size_t size = 1;//size is set to one for final '\0' char in an array 
     char* p = "";//if both c_strings are empty this is returned 
     bool has_left_ = false; 
     bool has_right_ = false; 
     if (strlen(left_)) 
     { 
      size += strlen(left_); 
      has_left_ = true; 
     } 
     if (strlen(right_)) 
     { 
      size += strlen(right_); 
      has_right_ = true; 
     } 
     bool both = has_left_ && has_right_ ? true : false; 
     if (both) 
     { 
      p = new char[size](); 
      const void* p_v = p;//just to keep address of beginning of p 
      const char* tmp = left_; 
      /*copying first c_string*/ 
      while (*p++ = *tmp++); 

      tmp = right_; 
      /*one too far after last loop*/ 
      --p; 
      while (*p++ = *tmp++); 

      *p = '\0'; 
      /*go back to the beginning of an array*/ 
      p = static_cast<char*>(const_cast<void*>(p_v)); 
      return p; 
     } 
     else if (has_left_) 
     { 
      return left_; 
     } 
     else if (has_right_) 
     { 
      return right_; 
     } 
     return p;//returns "" if both c_strings were empty 
    } 


    My_List::My_List(const My_List& pat):left_(nullptr),right_(nullptr) 
    { 
     name_ = pat.name_ + MyChar("_cpy"); 
     My_List* pattern = const_cast<My_List*>(&pat); 
     My_List* target = this; 
     while (pattern->right_) 
     { 

      target->right_ = static_cast<My_List*>(malloc(sizeof(My_List))); 
      *target->right_ = *pattern->right_; 
      target->right_->set_name(pattern->right_->get_name() + MyChar("_cpy")); 
      target->right_->left_ = static_cast<My_List*>(malloc(sizeof(My_List))); 
      *target->right_->left_ = *pattern->right_->left_; 
      target->right_->left_->set_name(pattern->right_->left_->get_name() + MyChar("_cpy")); 
      pattern = pattern->right_; 
      target = target->right_; 
     } 
    } 

    void My_List::insert(My_List* obj) 
    { 
     /*to catch first branch*/ 
     My_List* tmp = this; 
     if (tmp->right_) 
     { 
      /*go to the end of right side*/ 
      while (tmp->right_) 
      { 
       tmp = tmp->right_; 
      } 

      tmp->right_ = obj; 
      obj->left_ = tmp; 
     } 
     else 
     { 
      tmp->right_ = obj; 
      obj->left_= this; 
     } 
    } 
    My_List* create(const char* name) 
    { 
     return new My_List(name); 
    } 
} 

//file main.cpp 
#include "stdafx.h" 
#include "list.h" 
using namespace st; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    list* my = create("a"); 
    list* b = create("b"); 
    my->insert(b);//HERE I'M GETTING ERROR 
    return 0; 
} 

錯誤消息: '錯誤1錯誤C2027:使用未定義的類型爲 'ST :: My_List' 13'使用未定義的類型

爲什麼?特別是如果我評論這一行,它將被編譯,create()使用這種類型。

+1

可怕的問題名稱,我的意思是,爲什麼有人會讀這個(除了我之外),有什麼問題??解釋更好 - >獲得更好的答案 – roundcrisis 2010-04-09 11:19:26

+0

嘗試使用類而不是結構,並以可讀的方式聲明類型/類而不是typedefs這裏和那裏 – RvdK 2010-04-09 11:23:54

回答

6

您在頭文件list.h中只做了一個前向聲明。實際的定義在list.cpp中。在編譯main.cpp時,您包含list.h,因此編譯器不知道類My_List中有哪些方法。你需要將結構定義移動到頭文件list.h中,你仍然可以保持list.cpp中的方法實現。

+0

謝謝,它的工作原理。 – 2010-04-09 11:25:30

+1

然後,也許你可以「接受」答案:) – ereOn 2010-04-09 11:55:39

+0

由於我不得不離開我的辦公室,並且因接受標記上的針尖時間限制而無法立即接受,所以當時我沒有接受答案。爲什麼有一個時間限制超出了我。如果沒有時間限制,我會接受他的答案,因爲我打算這樣做,但由於這個荒謬的時間限制,我現在必須解釋自己,而不是僅僅接受這個按鈕。當然,對Meta寫作沒有意義 - 他們總是有非常合理的解釋,爲什麼這樣做就是這樣。 – 2010-04-09 15:21:18