2010-12-11 25 views
7

Tôi rất mới đối với C++ nên đây có thể là câu hỏi dễ trả lời. Tôi đang viết một lớp (Person) và khi một Person được tạo, nó sẽ được gán một tên ngẫu nhiên từ một tập hợp các tên được xác định trước. Vì vậy, trong lớp Person tôi muốn xác định một số loại bộ sưu tập tĩnh của chuỗi mà tôi có thể truy cập ngẫu nhiên và do đó tôi cũng sẽ cần phải biết có bao nhiêu có.Làm cách nào để triển khai một bộ sưu tập tĩnh của các chuỗi trong lớp của tôi

Tôi cũng đang sử dụng Qt ở đây, vì vậy giải pháp tốt nhất nên sử dụng mọi thứ từ thư viện chuẩn hoặc thư viện Qt.

Tôi đến từ một nền tảng Java và Java tôi có lẽ sẽ làm một cái gì đó như:

private static final String[] NAMES = { "A", "B" }; 

Điều gì sẽ là tương đương trong trường hợp này?

Trả lời

21

Bạn có thể sử dụng QStringList.

Person.h:

class Person 
{ 
private: 
    static QStringList names; 
}; 

Person.cpp:

QStringList Person::names = QStringList() << "Arial" << "Helvetica" 
    << "Times" << "Courier"; 
8

Giả sử C++ 03:

class YourClass { 
    static const char*const names[]; 
    static const size_t namesSize; 
}; 

// in one of the translation units (*.cpp) 
const char*const YourClass::names[] = {"A", "B"}; 
const size_t YourClass::namesSize = sizeof(YourClass::names)/sizeof(YourClass::names[0]); 

Giả sử C++ 0x:

class YourClass { 
    static const std::vector<const char*> names; 
}; 

// in one of the translation units (*.cpp) 
const vector<const char*> YourClass::names = {"A", "B"}; 

Và tất nhiên bạn có thể sử dụng chuỗi yêu thích của bạn gõ thay vì const char*.

+0

Cảm ơn cho câu trả lời, thật khó để chọn một câu trả lời chấp nhận cho rằng họ là tất cả đúng, nhưng tôi chỉ đi với QStringList trả lời hoàn toàn bởi vì nó phù hợp với thực tế là tôi đang cố gắng học hỏi Qt. – DaveJohnston

+0

@Dave: Mặc dù tôi có thể hiểu bạn, tôi vẫn thích viết mã chuẩn và di động hơn nếu có thể. Thậm chí nếu nó không gọn gàng (ví dụ C++ 03). – ybungalobill

4

Đầu tiên, một chương trình rất đơn giản để tạo ra cái tên ngẫu nhiên từ một mảng tĩnh. Việc thực hiện lớp thích hợp có thể được tìm thấy tiếp tục xuống.

#include <iostream> 
#include <string> 
#include <stdlib.h> 
#include <time.h> 

// import the std namespace (to avoid having to use std:: everywhere) 
using namespace std; 
// create a constant array of strings 
static string const names[] = { "James", "Morrison", 
           "Weatherby", "George", "Dupree" }; 
// determine the number of names in the array 
static int const num_names = sizeof(names)/sizeof(names[0]); 

// declare the getRandomName() function 
string getRandomName(); 

// standard main function 
int main (int argc, char * argv[]) 
{ 
    // seed the random number generator 
    srand(time(0)); 
    // pick a random name and print it 
    cout << getRandomName() << endl; 
    // return 0 (no error) 
    return 0; 
} 

// define the getRandomName() function 
string getRandomName() 
{ 
    // pick a random name (% is the modulo operator) 
    return names[rand()%num_names]; 
} 

thực hiện Lớp

Person.h

#ifndef PERSON_ 
#define PERSON_ 

#include <string> 

class Person 
{ 
    private: 
     std::string p_name; 
    public: 
     Person(); 
     std::string name(); 
}; 

#endif 

Person.cpp

#include "Person.h" 
#include <stdlib.h> 

using namespace std; 

static string const names[] = { "James", "Morrison", 
           "Weatherby", "George", "Dupree" }; 
static int const num_names = sizeof(names)/sizeof(names[0]); 

Person::Person() : p_name(names[rand()%num_names]) { } 
string Person::name() { return p_name; } 

main.cpp

#include <iostream> 
#include <string> 
#include <stdlib.h> 
#include <time.h> 
#include "Person.h" 

using namespace std; 

int main (int argc, char * argv[]) 
{ 
    // seed the random number generator 
    srand(time(0)); 

    // create 3 Person instances 
    Person p1, p2, p3; 

    // print their names 
    cout << p1.name() << endl; 
    cout << p2.name() << endl; 
    cout << p3.name() << endl; 

    // return 0 (no error) 
    return 0; 
} 
+0

Một lời giải thích tốt, nhưng 'sử dụng không gian tên std;' là một ý tưởng tồi và có thể gây ra một loạt các vấn đề, nhiều trong số đó đã được đăng ở đây trên SO do xung đột không gian tên.Phải mất thời gian tới không có thời gian để gõ 'std ::'. –

+3

sử dụng "' sử dụng không gian tên std; '" là xấu * trong tệp tiêu đề *. Sử dụng nó trong một tập tin nguồn là hoàn toàn tốt đẹp. –

+0

Mặc dù, một cách tự nhiên, cuộc tranh luận sẽ diễn ra trên ':)' http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c –

Các vấn đề liên quan