интеллектуальные указатели

Ответить
ya
^-^
Сообщения: 2535
Зарегистрирован: 16 дек 2021, 19:56

интеллектуальные указатели

Сообщение ya »

Код: Выделить всё

#include <iostream>
#include <vector>
#include <string>
#include <memory>

struct Person
{
	std::string name;
	int age;
	
	void SetAge(int ageToSet)
	{
		age = ageToSet;
	}
	
	int GetAge() const
	{
		return age;
	}
};

int main()
{
	Person john{"John", 20};
	Person mark{"Mark", 26};
	Person dave{"Dave", 31};
	
	std::vector<Person*> nameList{&john, &mark, &dave};
	
	nameList[0]->SetAge(45);
	
	std::cout << john.GetAge() << '\n';//Works, the pointer changed the value
}
ya
^-^
Сообщения: 2535
Зарегистрирован: 16 дек 2021, 19:56

Re: интеллектуальные указатели

Сообщение ya »

если по какой-то причине мне абсолютно необходимо было иметь объект, И мне нужно было передать его вектору, и я хотел, чтобы вектор модифицировал оригинал, тогда я бы использовал указатель, однако, поскольку мне не нужна эта функциональность, мы можем просто сделать это:

Код: Выделить всё

#include <iostream>
#include <vector>
#include <string>

class Person 
{
    public:
        Person(const std::string& name, int age) : mName(name), mAge(age) 
        {}

        std::string GetName() const
        {
            return mName;
        }

        int GetAge() const
        {
            return mAge;
        }

        void SetAge(int age)
        {
            if (age > 0 && age < 99)
            {
                mAge = age;
            }
        }

    private:
        std::string mName{};
        int mAge{};
};

int main() 
{
    std::vector<Person> people;

    // Constructing objects directly in the vector
    people.emplace_back("Alice", 30);
    people.emplace_back("Bob", 25);
    people.emplace_back("Charlie", 35);

    people[0].SetAge(45);

    for (const auto& person : people) 
    {
        std::cout << person.GetName() << " is " << person.GetAge() << " years old." << std::endl;
    }

    return 0;
}
Ответить