2012-10-30 4 views
0

То, что я хочу, это функция, которая делает новый отдельный экземпляр каждый раз, когда я называю его (с другим именем ...)Новый объект C++ каждый раз, когда вызывается функция?

Так же, как это:

void person::new_person(){ 
    person *(id+index) = new person(name_temp, age_temp, quote_temp); 
} 

Но это не работает. .. Я не знаю, как мне это сделать ... (индекс добавляется по одному каждый раз, когда я делаю новый экземпляр). И я понял, каждый раз, когда я сделать указатель и просто добавить пробелы в нем, как и что:

int*p; 
*(p+1) = 5; 

собирает, но замерзает во время работы (я supose его получение Memmory то не допускается), так что «человек * (id + index) "может и не работать. Как вы думаете?

+1

Непонятно, что вы пытаетесь сделать. У вас не может быть динамически сгенерированных имен переменных. Вы можете создавать новые объекты при каждом вызове функции, но вам нужно выделенное место для их хранения, будь то в определенной переменной или массиве или векторе или какой-либо другой коллекции ... – Joe

+12

В краткосрочной перспективе вам нужен контейнер, в идеале что-то вроде ' станд :: VECTOR'. В долгосрочной перспективе вам нужна [хорошая книга] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –

ответ

5

Вы имеете в виду что-то вроде этого?

#include <string> 

person make_person() 
{ 
    static unsigned i = 0; 
    return person(std::to_string(i++)); 
} 
+0

Почему бы просто не вернуть «человека»? Здесь нет никакой причины для (умного) указателя. – juanchopanza

+0

Да. Хорошая точка зрения. – StackedCrooked

+0

Я не думаю, что 'i' необходимо, но способность передавать параметры. –

8

Попробуйте держать ваши person с в стандартном контейнере:

std::vector<person> people; 
void person::new_person(std::string name, int age, std::string quote){ 
     people.push_back(person(name, age, quote)); 
} 
+1

Без globals? Довольно, пожалуйста? – slaphappy

+0

Педагогический вопрос: Должен ли я создать args 'const std :: string &', который в конечном итоге будет правильным ответом или пройдет по значению, чтобы избежать путаницы OP? –

+3

@ Robᵩ вы все равно копируете 'имя', поэтому вы должны сделать его аргументом значения, а затем сделать' people.emplace_back (std :: move (name), age, std :: move (quote)); '. –

3

“ То, что я хочу, это функция, которая делает новый отдельный экземпляр каждый раз, когда я называю его (с другим именем. ..) ”

Это ’ с известным как конструктор, и это особый тип функции-члена с тем же именем, что и класс. Он не делает ’ t имеет тип результата функции, даже не void. Он может идти, как это:

class Person 
{ 
private: 
    string name_; 

public: 
    Person(string name) 
     : name_(name) 
    {} 
}; 

Тогда существует множество способов назвать его, в зависимости от того, где вы хотите, чтобы новый экземпляр сохраненного. Например,

int main() 
{ 
    Person a("A"); // Local variable 
    Person("B");  // A temporary, it's already destroyed... ;-) 
    vector<Person> v; 
    v.emplace_back("C"); // As a new item at the end of vector. 
} 

Плюс некоторые из них, но я думаю, что три способа, указанные выше, являются наиболее важными для полного новичка.

Обратите внимание, что с помощью вектора каждый раз, когда вы push_back или emplace_back вы, ’, создаете новый последний элемент с новым индексом. Вызовите метод size, чтобы узнать, сколько у вас предметов в векторе. Для получения дополнительной информации проверьте документацию.

Кстати, вы действительно должны получить себе учебник.

+0

Интересная интерпретация, но из-за 'person (name_temp, age_temp, quote_temp)' в вопросе, я бы предположил, что это неправильная интерпретация. –

+0

62 C: \ Dev-Cpp \ MyCompilations \ Class Pessoa.cpp 'vector 'не является членом' std' –

+0

@ DhiegoMagalhães: вам нужно добавить соответствующие '# include' и 'using'. Учебник помогает. Но для того, чтобы вас завести, для 'string' вам нужно' #include ', для' vector' вам нужно '#include ', и для обоих вам нужно либо добавить 'std ::' перед именами, или добавить 'using', например' using std :: string'. –

Смежные вопросы