- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我尝试了多种方法为我的类创建一个在构造函数中传递数字的计数器
我希望它输出如下内容:
input the amount of base class objects: 2
The A# 1:
input SomeVar_one: 3
input SomeVar_two: 2
The A# 2:
input SomeVar_one: 2
input SomeVar_two: 3
input the amount of derived class objects: 2
The A# 1:
input SomeVar_one: 23
input SomeVar_two: 32
The A# 2:
input SomeVar_one: 12
input SomeVar_two: 42
total # of base objects is: 4
total # of derived objects is: 4
我在哪里得到这个:
input the amount of base class objects: 2
The A# 1:
input SomeVar_one: 3
input SomeVar_two: 2
The A# 2:
input SomeVar_one: 2
input SomeVar_two: 3
input the amount of derived class objects: 2
The A# 3:
input SomeVar_one: 23
input SomeVar_two: 32
The A# 4:
input SomeVar_one: 12
input SomeVar_two: 42
total # of base objects is: 4
total # of derived objects is: 4
注意用户提示输入值的区别,这些值是从
new
调用的构造函数调用的。运算符(operator)
new
时立即实例化对象。操作符在没有进入
for
的情况下被调用我 ofc 可以调用的循环
"The (A/B) # (i)"
这是我使用过的代码:它使用“奇怪的重复模板模式”(顺便说一句,这个名字是一个杀手!)
//sample
#include<iostream>
template <typename T>
class counter
{
public:
counter(bool do_count = true) : counted(do_count)
{
if (counted) get_count()++;
}
~counter()
{
if (counted) get_count()--;
}
static unsigned long GetInstancesCount()
{
return get_count();
}
private:
bool counted;
static unsigned long& get_count()
{
static unsigned long count = 0;
return count;
}
};
class base:public counter<base>
{
protected:
int m_SomeVar_one = 0, m_SomeVar_two = 0;
unsigned long ObjectNumber = 0;
public:
base(bool count=true):counter<base>(count),ObjectNumber(counter<base>::GetInstancesCount())
{
std::cout << "The A# " << ObjectNumber <<": " << std::endl;
std::cout << "input SomeVar_one: ";
std::cin >> m_SomeVar_one;
std::cout << "input SomeVar_two: ";
std::cin >> m_SomeVar_two;
}
virtual int get_count()
{
return counter<base>::GetInstancesCount();
}
};
class derived :public base, public counter<derived>
{
protected:
int m_SomeVar_three = 0;
public:
derived(bool count = true) :base(false), counter<derived>(count)
{
std::cout << "input SomeVar_three: ";
std::cin >> m_SomeVar_three;
}
virtual int get_count() override
{
return counter<derived>::GetInstancesCount();
}
};
int main()
{
std::cout << "input the amount of base class objects: ";
int amountOfBaseObjects;
std::cin >> amountOfBaseObjects;
base* BaseArray = new base[amountOfBaseObjects];
std::cout << "input the amount of derived class objects: ";
int amountOfDerivedObjects;
std::cin >> amountOfDerivedObjects;
base* DerivedArray = new base[amountOfDerivedObjects];
std::cout <<"total # of base objects is: "<< BaseArray->get_count() << std::endl;
std::cout << "total # of derived objects is: " << DerivedArray->get_count() << std::endl;
}
最佳答案
CRTP 与虚拟多态性并不能很好地融合 - 虚拟多态性涉及一个公共(public)基类,而 CRTP 为每个派生类型生成一个不同的基类。
无论如何,你可以用组合来破解它。这是带有工厂方法模板的非模板版本的计数器。请注意,要进行准确的引用计数,必须遵循 3 规则:
class counter
{
public:
template <typename T>
static counter create()
{
static unsigned long count = 0;
return { &count };
}
counter(const counter& that) : count_addr(that.count_addr)
{
(*count_addr)++;
}
counter& operator =(const counter& that)
{
(*count_addr)--;
count_addr = that.count_addr;
(*count_addr)++;
return *this;
}
~counter()
{
(*count_addr)--;
}
unsigned long GetInstancesCount()
{
return *count_addr;
}
private:
unsigned long* count_addr;
counter(unsigned long* count_addr) : count_addr(count_addr)
{
(*count_addr)++;
}
};
然后,您可以将计数器作为基类的成员嵌入,派生类可以选择通过 protected 构造函数提供自己的计数器。公共(public)构造函数转发工厂方法而不是计数器的位是确保没有事件的临时拷贝,这可能会意外地增加计数,当
ObjectNumber
被安排了。
class base
{
public:
base() : base(counter::create<base>)
{
}
int get_count()
{
return ctr.GetInstancesCount();
}
private:
counter ctr;
protected:
base(counter(*ctr)()) : ctr(ctr()), ObjectNumber(this->ctr.GetInstancesCount())
{
std::cout << "The A# " << ObjectNumber <<": " << std::endl;
}
unsigned long ObjectNumber; // important - must come after counter
};
class derived : public base
{
public:
derived() : base(counter::create<derived>)
{
}
};
之后,我可以大致复制您的预期输出:
https://godbolt.org/z/eonfb9
关于c++ - 在默认构造函数中可见的继承类的 c++ 计数器的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64396538/
我使用的是 PHP 5.3 稳定版,有时会遇到非常不一致的行为。据我所知,在继承中,父类(super class)中的所有属性和方法(私有(private)、公共(public)和 protected
所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下: class Parent { public String name = "Pare
给定这些类: class Father { public Father getMe() { return this; } } class Child extends Father {
为什么最后打印“I'm a Child Class”。 ? public class Parent { String parentString; public Parent()
我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 javascript 设计的真正目的。
我已经使用表单继承有一段时间了,但没有对以下方法进行太多研究。只需创建一个新类而不是表单并从现有表单继承并根据需要将所需控件转换为 protected 。 Visual Studio 2010 设计器
我原以为下面的代码片段会产生编译错误,因为派生类不会有我试图在 pub_fun() 中访问的 priv_var。但是它编译了,我得到了下面提到的输出。有人可以解释这背后的理论吗? class base
继承的替代方案有哪些? 最佳答案 Effective Java:优先考虑组合而不是继承。 (这实际上也来自《四人帮》)。 他提出的情况是,如果扩展类没有明确设计为继承,继承可能会导致许多不恰当的副作用
我有2个类别:动物( parent )和狗(动物的“ child ”),当我创建一个 Animal 对象并尝试提醒该动物的名称时,我得到了 undefined ,而不是她的真名。为什么?(抱歉重复发帖
我试图做继承,但没想到this.array会像静态成员一样。我怎样才能让它成为“ protected /公开的”: function A() { this.array = []; } func
在创建在父类中使用的 lambda 时,我试图访问子类方法和字段。代码更容易解释: class Parent { List> processors; private void do
如果我有一个对象,我想从“ super 对象”“继承”方法以确保一致性。它们将是混合变量。 修订 ParentObj = function() { var self = this; t
class Base { int x=1; void show() { System.out.println(x); } } class Chi
目前我正在尝试几种不同的 Javascript 继承方法。我有以下代码: (“借用”自 http://www.kevlindev.com/tutorials/javascript/inheritanc
我在 .popin-foto 元素中打开一个 popin。当我尝试在同一元素中打开子类 popin 时,它不起作用。 代码 这是 parent function Popin(container, ti
我有以下两个类: class MyClass { friend ostream& operatorvalue +=1; return *this; } 现在
有没有办法完全忽略导入到 html 文件中的 header 中的 CSS 文件? 我希望一个页面拥有自己独立的 CSS,而不是从任何其他 CSS 源继承。 最佳答案 您可以在本地样式表中使用 !imp
Douglas Crockford似乎喜欢下面的继承方式: if (typeof Object.create !== 'function') { Object.create = functio
假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public
class LinkedList{ public: int data; LinkedList *next; }; class NewLinkedList: public Lin
我是一名优秀的程序员,十分优秀!