2012-05-02 42 views
9

Tôi đang gặp sự cố khi khai báo và khởi tạo mảng char. Nó luôn hiển thị các ký tự ngẫu nhiên. Tôi tạo ra một chút nhỏ hơn của mã để hiển thị những gì tôi đang cố gắng trong chương trình lớn hơn của tôi:Làm thế nào tôi có thể khởi tạo mảng char trong một hàm tạo?

class test 
{ 
    private: 
     char name[40]; 
     int x; 
    public: 
     test(); 
     void display() 
     { 
      std::cout<<name<<std::endl; 
      std::cin>>x; 
     } 
}; 
test::test() 
{ 
    char name [] = "Standard"; 
} 

int main() 
{ test *test1 = new test; 
    test1->display(); 
} 

Và xin lỗi nếu định dạng của tôi là xấu, tôi hầu như không thể tìm ra trang web này hãy để một mình làm thế nào để sửa chữa mã của tôi :(

+0

Liên quan: [Làm cách nào tôi có thể sử dụng danh sách khởi tạo thành viên để khởi tạo?] (Http://stackoverflow.com/q/5602030/636019) – ildjarn

+0

OK, vì vậy tôi đang sử dụng std :: string now, tuy nhiên trong chương trình lớn hơn, đây là vì tôi đã sử dụng hàm get như thế này : void get (char prompt [], int size, char b []) trong đó char b [] là mảng char của tôi từ trước. Làm thế nào tôi sẽ sửa đổi điều đó để truyền một chuỗi cho hàm get của tôi? – ShengLong916

+0

Trả về đối tượng 'std :: string' thay vì' void'. – ildjarn

Trả lời

4

Vì bạn đang sử dụng C++, tôi đề nghị sử dụng chuỗi thay vì mảng char. Nếu không, bạn sẽ cần phải sử dụng strcpy (hoặc bạn bè).

Ngoài ra, bạn quên để xóa các dụ test1.

#include <iostream> 
#include <string> 

class test 
{ 
    private: 
     std::string name; 
     int x; 
    public: 
     test(); 
     void display() 
     { 
      std::cout<<name<<std::endl; 
     } 
}; 

test::test() 
{ 
    name = "Standard"; 
} 

int main() 
{ 
    test test1; 
    test1.display(); 

    std::cin>>x; 
} 
+0

Cảm ơn các bạn rất nhiều! – ShengLong916

+1

trường hợp sử dụng cho mảng char: C++ có sẵn ở những nơi không có lib std, như vi điều khiển. –

5

Xét bạn gắn thẻ các câu hỏi như C++, bạn nên sử dụng std::string:

#include <string> 

class test 
{ 
    private: 
     std::string name; 
     int x; 
    public: 
     test(); 
     void display() 
     { 
      std::cout<<name<<std::endl; 
      std::cin>>x; 
     } 
}; 
test::test() : name("Standard") 
{ 

} 
+0

Cảm ơn bạn rất nhiều điều này đã giúp rất nhiều. – ShengLong916

+0

Tôi chưa bao giờ hoàn toàn hiểu được cách các câu trả lời 'giống hệt' được đăng _later_ sẽ nhận được nhiều lợi ích hơn. Và câu trả lời của tôi được cho là khá nhiều hoàn hảo hơn từ việc đi ... – sehe

+0

Tôi không thực sự có được trang web này nhưng tôi đã cố gắng để upvote cả hai nhưng không thể. Lấy làm tiếc. – ShengLong916

6

constructor của bạn không được thiết lập các biến thành viên name, nó khai báo một biến địa phương. Khi biến cục bộ không nằm ngoài phạm vi của hàm tạo, nó biến mất. Trong khi đó biến thành viên vẫn chưa được khởi tạo và được đổ đầy rác ngẫu nhiên.

Nếu bạn định sử dụng các mảng ký tự kiểu cũ, bạn cũng sẽ cần sử dụng chức năng cũ như strcpy để sao chép vào biến thành viên. Nếu tất cả những gì bạn muốn làm là đặt nó thành một chuỗi rỗng, bạn có thể khởi tạo nó bằng name[0] = 0.

9

Nếu không có lý do cụ thể nào để không sử dụng std::string, hãy sử dụng std::string.

Nhưng nếu bạn thực sự cần phải khởi tạo mà thành viên mảng nhân vật, sau đó:

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

class test 
{ 
    private: 
     char name[40]; 
     int x; 
    public: 
     test(); 
     void display() const 
     { 
      std::cout<<name<<std::endl; 
     } 
}; 

test::test() 
{ 
    static char const nameData[] = "Standard"; 

    assert(strlen(nameData) < sizeof(name)); 
    strcpy(name, nameData); 
} 

int main() 
{ 
    test().display(); 
} 
+1

Tôi nghĩ cơ thể 'main' là một chút khó hiểu, đo lường giai đoạn học tập của OP. :) – sehe

+0

Vì vậy, tôi quyết định sử dụng std :: string, nhưng theo nhận xét của tôi ở trên, làm cách nào để chuyển một chuỗi vào một hàm khác ? – ShengLong916

2

thực sự cung cấp hai cách để làm điều này. Bạn có thể mặc định thành viên trên dòng khai báo của nó hoặc bạn có thể sử dụng danh sách khởi tạo hàm dựng.

Ví dụ về dòng tuyên bố khởi:

class test1 { 
    char name[40] = "Standard"; 
public: 
    void display() { cout << name << endl; } 
}; 

Ví dụ về constructor khởi tạo:

class test2 { 
    char name[40]; 
public: 
    test2() : name("Standard") {}; 
    void display() { cout << name << endl; } 
}; 

Bạn có thể thấy một ví dụ sống của cả hai ở đây: http://ideone.com/zC8We9

sở thích cá nhân của tôi là để sử dụng cách khởi tạo dòng khai báo vì:

  1. Trường hợp không có các biến số khác phải được xây dựng này cho phép các nhà xây dựng mặc định được tạo ra sẽ được sử dụng
  2. đâu nhiều nhà xây dựng được yêu cầu này cho phép biến được khởi tạo trong chỉ có một nơi chứ không phải trong tất cả các danh sách constructor khởi tạo

Đã nói tất cả điều này, sử dụng char[] có thể bị coi là gây thiệt hại như nhà điều hành gán mặc định đã tạo và các nhà xây dựng sao chép/di chuyển sẽ không hoạt động.Điều này có thể được giải quyết bằng cách:

  1. Làm thành viên const
  2. Sử dụng một char* (điều này sẽ không hoạt động nếu các thành viên sẽ tổ chức bất cứ điều gì nhưng một chuỗi chữ)
  3. Trong trường hợp tổng quát std::string nên được ưa thích
Các vấn đề liên quan