我设计应该以这种方式工作的观察者模式:观察者调用AddEventListener的方法EventDispatcher,并传递一个字符串,它是的名称event,PointerToItself和PointerToItsMemberMethod
之后event发生在EventDispatcher; 它查看订阅列表,如果有一些,则分配给此事件调用该action方法observer.
我来这里了EventDispatcher.h.小心包含一些伪代码.
这是两个问题:
actionin 的类型struct Subscription?PS:不,我不会使用boost或任何其他库.
#pragma once
#include <vector>
#include <string>
using namespace std;
struct Subscription
{
void* observer;
string event;
/* u_u */ action;
};
class EventDispatcher
{
private:
vector<Subscription> subscriptions;
protected:
void DispatchEvent ( string event );
public:
void AddEventListener ( Observer* observer …Run Code Online (Sandbox Code Playgroud) 假设我们想要创建一个计算两条线交点的函数.交点不总是定义的或唯一的.如何在函数的签名中反映出来?
我想出了这些选择:
bool getIntersectionPoint ( Line& a, Line& b , Point& result );
如果行是并行的,则返回false.否则返回true并将结果写入变量.
Point getIntersectionPoint ( Line& a, Line& b );
如果线条平行,则抛出异常.
[update]
如果我们创建2个函数bool doLinesIntersect(const Line&, const Line&);,Point twoLinesIntersection(const Line&, const Line&);第二个函数仍然可以在第一个函数返回false后调用.
尝试使简单的代码工作:
std::thread threadFoo;
std::thread&& threadBar = std::thread(threadFunction);
threadFoo = threadBar; // thread& operator=( thread&& other ); expected to be called
Run Code Online (Sandbox Code Playgroud)
得到错误:
使用已删除的函数'std :: thread&std :: thread :: operator =(const std :: thread&)'
我明确地定义threadBar为右值引用,而不是普通引用.为什么没有预期的操作员被调用?如何将一个线程移动到另一个线程?
谢谢!
我正在读一本由克里斯卡巴斯基解释软件安全理念和技术的书 [rus](对不起,我现在找不到英文版).
书中有一个例子.它声明代码:
if ( ! IsValidUser() )
{
Message("Invalid user! Abroting...");
Abort;
}
Run Code Online (Sandbox Code Playgroud)
是完全不安全的,因为它被翻译成这样:
CALL IsValidUser
OR AX,AX
JZ continue
^^^^^^^^^^^^^
PUSH offset str_invalid_user
CALL Message
CALL Abort
continue: ; normal program execution
...........
Run Code Online (Sandbox Code Playgroud)
因此,可以通过改变反汇编器中的一个字节来破解程序.如果我们更改JZ continue为JMP continue检查将无法正确执行.
然后克里斯写道:
C中程序的更正版本是:
IsValidUser();
if (!true)
{
Message("Invalid user! Aborting...");
Abort;
}
Run Code Online (Sandbox Code Playgroud)
在这个版本中,该{...}部分永远不会得到控制.
我真的不知道修正后的版本应该如何工作.为什么他会使用一个if-statement永远不会被执行的东西,甚至可以被编译器删除?
这是一种拼写错误还是错误?或者我没有得到什么?
void foo ( Bar* bar , void(Bar::*qux)(void) )
{
if ( bar )
{
bar->qux();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:
bar可以在其他线程检查后删除。
我无法添加互斥锁成员Bar来锁定它。
因此我想知道,如果我可以告诉处理器原子地运行这个函数,我该怎么做?我在谷歌上花了很多时间,但没有找到可以理解的手册......
PS的Debian,GCC,增压NOT允许,C ++ 11 IS允许的。
我正在阅读一些关于STL的文档,并且在那里写了该end()函数返回容器的最后一个元素旁边的字节的迭代器.
我想知道,如果容器占用整个可用内存的最后一个字节,该怎么办?那会发生什么?
#include <iostream>
namespace Foo
{
class Baz { };
std::ostream& operator<< ( std::ostream& ostream , const Baz& baz )
{
return ostream << "operator<<\n";
}
}
int main()
{
std::cout << Foo::Baz();
}
Run Code Online (Sandbox Code Playgroud)
我operator<<在Foo命名空间中定义了一个.为什么可以从全球范围调用它?
为什么编译器将&Foo::foo其视为void (*)(). 我希望它被视为相反,void(Foo::*)()因为它是 的成员Foo。
class Foo\n{\n public:\n static void foo ( void ){}\n};\n\nvoid foo ( void(Foo::*)(void) ){}\n\nint main()\n{ \n foo(&Foo::foo); // error: cannot convert \xe2\x80\x98void (*)()\xe2\x80\x99 to \xe2\x80\x98void (Foo::*)()\xe2\x80\x99\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n 我有一个程序可以创建我自己的Class的许多实例.然后我操作它们:读取,更改,将它们传递给某些第三方方法等.
有三个问题.
我是否存储实例向量或指针向量?为什么?
如果我不希望做我传递给函数的一个实例或指向它改变一个实例?为什么?
如果我不希望改变的情况下,我通过指针或引用?为什么?
提前致谢!
类示例:
class Player {
public:
static const char width = 35;
static const char height = 5;
static const char speed = 15;
int socketFD;
float xMin;
float xMax;
char status;
float x;
float y;
char direction;
Player ( int );
void Reset();
void Move();
void SetHost();
void SetClient();
private:
void EscapeCheck();
};
Run Code Online (Sandbox Code Playgroud) 我正在阅读一些关于线程的手册,我想到他们展示的代码并不安全:
std::cout << "starting first helper...\n";
std::thread helper1(foo);
std::cout << "starting second helper...\n";
std::thread helper2(bar);
std::cout << "waiting for helpers to finish..." << std::endl;
helper1.join(); // #1 NOT SAFE
helper2.join(); // #2 NOT SAFE
Run Code Online (Sandbox Code Playgroud)
我相信这段代码并不是绝对安全的.如果我没有误会,当控制到达标记为和的行时,无法保证helper1并且helper2已经处于可连接状态.线程仍然无法启动,此时没有任何ID.这将导致未被捕获的异常被抛出#1#2std::thread::join()
我认为以下代码解决了这个问题.我对吗?
std::cout << "starting first helper...\n";
std::thread helper1(foo);
std::cout << "starting second helper...\n";
std::thread helper2(bar);
std::cout << "waiting for helpers to finish..." << std::endl;
while ( helper1.joinable() == false ) { }
helper1.join(); // #1 SAFE …Run Code Online (Sandbox Code Playgroud)