在另一个类中使用成员方法"generically"
Use member methods in another class "generically"
我想做以下事情:我有一个Person类,我希望能够在其中使用抽象Animal类的任何类型的实现,所以我希望能够在主方法中创建多个人,其中每个人都能够使用狗或猫等,并且这些人应该使用特定的doSomething()方法实现来自特定的狗,猫等。现在的实现不工作,我知道,编译器当然说,动物不能使用doSomething()方法(因为它是虚拟的)。我怎样才能实现我在这里想要做的?
person.h
#include <animal.h>
class Person
{
public:
Person();
~Person();
Animal *ani;
};
Person::Person (Animal *pointer)
{
ani = new Animal ();
}
Person::SomeMethod ()
{
ani->doSomething ();
}
Person::~Person ()
{
delete ani;
}
animal.h
class Animal
{
public:
Animal();
~Animal();
virtual void doSomething () = 0;
};
class Dog : public Animal
{
public:
Dog();
~Dog();
void doSomething ();
};
Dog::Dog ()
{
std::cout << "I've been created!" << std::endl;
}
Dog::doSomething ()
{
std::cout << "Hello" << std::endl;
}
main.h
#include <animal.h>
#include <person.h>
int main()
{
Dog *bowser;
Person *will = new Person (bowser);
return 0;
}
以下是Person
接受任何Animal
的示例:
#include <iostream>
class Animal
{
public:
Animal() = default;
virtual ~Animal() {};
virtual void doSomething() = 0;
};
class Person
{
public:
Person(Animal* pointer);
~Person();
void SomeMethod();
Animal *ani;
};
Person::Person(Animal *pointer)
: ani{pointer} // initialize from passed pointer
{
//ani = new Animal(); //Person doesn't create/own an animal
}
void Person::SomeMethod()
{
ani->doSomething();
}
Person::~Person()
{
//delete ani; // Person doesn't own animal
}
class Dog : public Animal
{
public:
Dog();
~Dog() = default;
void doSomething();
};
Dog::Dog()
{
std::cout << "I've been created!" << std::endl;
}
void Dog::doSomething()
{
std::cout << "Hello" << std::endl;
}
int main()
{
Dog bowser; // no new here, RAII will take care of killing the Dog
Dog* bowser_ptr = &bowser;
Person will(bowser_ptr);
will.SomeMethod();
return 0;
}
下面是Person
拥有随机Animal
的例子:
#include <vector>
#include <iostream>
#include <random>
#include <exception>
class Animal
{
public:
Animal() = default;
virtual ~Animal() {}; // must be virtual!
virtual void doSomething() = 0;
};
class Dog : public Animal
{
public:
Dog();
~Dog();
void doSomething();
};
class Cat : public Animal
{
public:
Cat();
~Cat();
void doSomething();
};
Animal* get_random_animal()
{
static std::random_device rd;
static std::mt19937 gen(rd());
static std::uniform_int_distribution<> dis(1, 2);
switch(dis(gen)) {
case 1:
return new Dog;
case 2:
return new Cat;
default:
throw std::runtime_error{"Not sure which animal."};
}
}
class Person
{
public:
Person();
Person(Person&&) = delete; // person contains raw pointers, we must either delete or specify the move constructor
Person(const Person&) = delete; // person contains raw pointers, we must either delete or specify the copy constructor
Person& operator=(Person&&) = delete; // person contains raw pointers, we must either delete or specify the move assignment operator
Person& operator=(const Person&) = delete; // person contains raw pointers, we must either delete or specify the copy assignment operator
~Person();
void SomeMethod();
Animal *ani;
};
Person::Person()
: ani{get_random_animal()} // initialize with random animal
{
}
void Person::SomeMethod()
{
ani->doSomething();
}
Person::~Person()
{
delete ani; // Person does own animal
}
Dog::Dog()
{
std::cout << "I've been created! Woof!" << std::endl;
}
Dog::~Dog()
{
std::cout << "I've been destroyed! Woof!" << std::endl;
}
void Dog::doSomething()
{
std::cout << "Woof" << std::endl;
}
Cat::Cat()
{
std::cout << "I've been created! Meow!" << std::endl;
}
Cat::~Cat()
{
std::cout << "I've been destroyed! Meow!" << std::endl;
}
void Cat::doSomething()
{
std::cout << "Meow" << std::endl;
}
int main()
{
Person will;
will.SomeMethod();
std::cout << "n More people with animals: n";
std::vector<Person> people(10);
return 0;
}
示例输出:
I've been created! Meow!
Meow
More people with animals:
I've been created! Woof!
I've been created! Meow!
I've been created! Meow!
I've been created! Meow!
I've been created! Meow!
I've been created! Meow!
I've been created! Woof!
I've been created! Meow!
I've been created! Woof!
I've been created! Woof!
I've been destroyed! Woof!
I've been destroyed! Meow!
I've been destroyed! Meow!
I've been destroyed! Meow!
I've been destroyed! Meow!
I've been destroyed! Meow!
I've been destroyed! Woof!
I've been destroyed! Meow!
I've been destroyed! Woof!
I've been destroyed! Woof!
I've been destroyed! Meow!
相关文章:
- 从私有成员变量的成员方法返回unique_ptr
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 如何对绑定的成员方法进行typedef,然后将该类型用作模板参数
- 从类C++外部调用指向成员方法的成员指针
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 对成员类型的成员方法使用 std::result_of<>
- 我是否应该在构造函数或成员方法中进行大量初始化工作
- 如何检查是否调用了成员方法
- 我怎么可能从尚未定义某些成员方法的类创建实例?(C++)
- 有没有办法强制对 clang-format/clang-tidy 中的类成员/方法使用 "this->"?
- 指向 objc 类成员方法的函数指针,用于C++
- 对集合调用成员方法
- JetBrains CLion 不能建议字符串的成员方法
- 我无法在班级中获得MED股票来调用成员方法
- 如何在本机回调中使用Cython CDEF类成员方法
- 通过指针从for_each循环中访问成员方法
- 调用成员方法时会丢失此指针
- 为什么点运算符(.)可以与私有类成员/方法一起使用
- 静态调度以使用聚合类型的层次结构更正成员方法
- 显式模板专用化不能具有存储类 - 成员方法专用化