Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Роб Пайк стоял у истоков Unix, Plan 9, Inferno и UTF-8. Сейчас работает в Google.действительно, вам лучше знать :)
Do not use a using-directive.
Google C++ style guide
We do not use C++ exceptions.
We do not use Run Time Type Information (RTTI).
We do not allow default function parameters, except in a few uncommon situations explained below.
All parameters passed by reference must be labeled const.
Не могу не отметить для здешних пуристов и интеллектуалов: софт, который управлял линией стоимостью в 140 миллионов долларов был написан… [барабанная дробь] на С# (ну это так, лирика).Цитата как раз про производство с большим кол-вом различных датчиков, приводов и т.д. Там дальше в комментариях подробнее, если интересно.
#include using std::cout;
using std::endl;
struct A {
virtual void f() { cout << "A::f()" << endl;}
};
struct B : virtual A {
virtual void f() { cout << "B::f()" << endl;}
};
struct C : B , virtual A {
using A::f;
};
void foo() {
C c;
c.f(); //calls B::f, the final overrider
c.C::f(); //calls A::f because of the using-declaration
}
Если кто-то напишет что-то подобное в реальном коде, его просто обязаны выгнать нахрен из профессии с волчьим билетом (либо за профнепригодность, либо за саботаж — в зависимости от причин, побудивших его написать такое).Ну это всё же не совсем правильно, выгонять из профессии за то, что используешь в коде примеры из стандарта. Вообще, если вашу мысль развить, то надо запретить вообще множественное наследование, а за ним и шаблоны (и может быть исключения). Потом запретить указатели (не все их понимают) и получить Паскаль.
Зачем 2 раза от A?Ну хорошо, давайте перепишем код вот так:
struct A {
virtual void f() { cout << "A::f()" << endl;}
};
struct B : virtual A {
virtual void f() { cout << "B::f()" << endl;}
};
struct D : virtual A {
virtual void g() {}
};
struct C : B , virtual D {
using A::f;
};PS Почему в вашем случае должен быть B::f а не A::f, разве они не оба финальные, просто в разных ветвях?По стандарту (10.3/2, class.virtual/2).
да просто пишите понятный лично вам код, и не будет никаких проблем
using System;
using System.Linq;
namespace SampleEvent
{
public delegate void SummResultDelegate(int summ);
class CalculatorCore
{
public event SummResultDelegate SummResultEvent;
public void Summ(params int[] arguments)
{
//Какая нибудь очень долго выполняющаяся функция ...
if (SummResultEvent != null)
{
SummResultEvent(arguments.Sum());
}
}
}
class CalculatorManager
{
public void Run()
{
var calc1 = new CalculatorCore();
calc1.SummResultEvent+=new SummResultDelegate(Calc1SummResultEvent);
calc1.Summ(1,2);
var calc2 = new CalculatorCore();
calc2.SummResultEvent += new SummResultDelegate(Calc2SummResultEvent);
calc2.Summ(5,6,7,8,9,10,12,15,17);
}
void Calc1SummResultEvent(int summ)
{
Console.WriteLine("Обработка результата 1-го калькулятора: {0}", summ);
}
void Calc2SummResultEvent(int summ)
{
Console.WriteLine("Обработка результата 2-го калькулятора: {0}", summ);
}
}
class Program
{
static void Main(string[] args)
{
new CalculatorManager().Run();
Console.ReadKey();
}
}
}
#include <numeric>
#include <functional>
#include <iostream>
class CalculatorCore
{
public:
std::function<void (int)> SummResultEvent;
void Summ(std::initializer_list<int>&& nums)
{
if (nums.size() != 0)
{
SummResultEvent(std::accumulate(nums.begin(), nums.end(), 0, std::plus<int>()));
}
}
};
class CalculatorManager
{
public:
void Run()
{
CalculatorCore calc1;
calc1.SummResultEvent = std::bind(
&CalculatorManager::Calc1SummResultEvent, this, std::placeholders::_1);
calc1.Summ({1,2});
CalculatorCore calc2;
calc2.SummResultEvent = std::bind(
&CalculatorManager::Calc2SummResultEvent, this, std::placeholders::_1);
calc2.Summ({5,6,7,8,9,10,12,15,17});
}
void Calc1SummResultEvent(int summ)
{
std::cout << "First calculator result: " << summ << std::endl;
}
void Calc2SummResultEvent(int summ)
{
std::cout << "Second calculator result: " << summ << std::endl;
}
};
int main()
{
CalculatorManager().Run();
std::cin.get();
}
#include <numeric>
#include <functional>
#include <iostream>
template<class CalcMan, void (CalcMan::*ResultEvent)(int)>
class CalculatorCore
{
public:
void Summ(CalcMan* manager, const int* val, int size) const
{
if (size != 0)
{
(manager->*ResultEvent)( std::accumulate(val, val + size, 0, std::plus<int>()) );
}
}
};
class CalculatorManager
{
public:
void Calc1SummResultEvent(int summ)
{
std::cout << "First calculator result: " << summ << std::endl;
}
void Calc2SummResultEvent(int summ)
{
std::cout << "Second calculator result: " << summ << std::endl;
}
void Run()
{
CalculatorCore<CalculatorManager, &CalculatorManager::Calc1SummResultEvent> calc1;
int vals1[] = {1,2};
calc1.Summ(this, vals1, sizeof(vals1)/sizeof(vals1[1]));
CalculatorCore<CalculatorManager, &CalculatorManager::Calc2SummResultEvent> calc2;
int vals2[] = {5,6,7,8,9,10,12,15,17};
calc2.Summ(this, vals2, sizeof(vals2)/sizeof(vals1[2]));
}
};
int main()
{
CalculatorManager().Run();
std::cin.get();
}
Роб Пайк подверг критике C++ и Java