小编Kol*_*nya的帖子

C++自己的观察者模式

我设计应该以这种方式工作的观察者模式:观察者调用AddEventListener的方法EventDispatcher,并传递一个字符串,它是的名称event,PointerToItselfPointerToItsMemberMethod

之后event发生在EventDispatcher; 它查看订阅列表,如果有一些,则分配给此事件调用该action方法observer.

我来这里了EventDispatcher.h.小心包含一些伪代码.

这是两个问题:

  1. 如何定义actionin 的类型struct Subscription
  2. 我正在朝着正确的方向前进吗?

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)

c++ pointers function-pointers observers observer-pattern

6
推荐指数
1
解决办法
1331
查看次数

如何返回穿越线的点?线条并不总是相交

假设我们想要创建一个计算两条线交点的函数.交点不总是定义的或唯一的.如何在函数的签名中反映出来?

我想出了这些选择:

  1. bool getIntersectionPoint ( Line& a, Line& b , Point& result );

    如果行是并行的,则返回false.否则返回true并将结果写入变量.

  2. Point getIntersectionPoint ( Line& a, Line& b );

    如果线条平行,则抛出异常.

[update]
如果我们创建2个函数bool doLinesIntersect(const Line&, const Line&);,Point twoLinesIntersection(const Line&, const Line&);第二个函数仍然可以在第一个函数返回false后调用.

c++ return exception function return-value

6
推荐指数
1
解决办法
393
查看次数

移动std :: thread

尝试使简单的代码工作:

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为右值引用,而不是普通引用.为什么没有预期的操作员被调用?如何将一个线程移动到另一个线程?

谢谢!

c++ multithreading assignment-operator move-semantics c++11

6
推荐指数
1
解决办法
7944
查看次数

需要解释特定的安全优化

我正在读一由克里斯卡巴斯基解释软件安全理念和技术的 [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 continueJMP continue检查将无法正确执行.

然后克里斯写道:

C中程序的更正版本是:

IsValidUser();
if (!true)
{
    Message("Invalid user! Aborting...");
    Abort;
}
Run Code Online (Sandbox Code Playgroud)

在这个版本中,该{...}部分永远不会得到控制.

我真的不知道修正后的版本应该如何工作.为什么他会使用一个if-statement永远不会被执行的东西,甚至可以被编译器删除?

这是一种拼写错误还是错误?或者我没有得到什么?

c c++ security assembly disassembly

6
推荐指数
1
解决办法
229
查看次数

C++ 创建原子函数

void foo ( Bar* bar , void(Bar::*qux)(void) )
{
    if ( bar )
    {
        bar->qux();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是:

  1. bar可以在其他线程检查删除。

  2. 我无法添加互斥锁成员Bar来锁定它。

因此我想知道,如果我可以告诉处理器原子地运行这个函数,我该怎么做?我在谷歌上花了很多时间,但没有找到可以理解的手册......

PS的Debian,GCC,增压NOT允许,C ++ 11 IS允许的。

c++ multithreading pointers mutex atomic

5
推荐指数
1
解决办法
9784
查看次数

STL迭代器:container.end()

我正在阅读一些关于STL的文档,并且在那里写了该end()函数返回容器的最后一个元素旁边的字节的迭代器.

我想知道,如果容器占用整个可用内存的最后一个字节,该怎么办?那会发生什么?

c++ containers iterator stl

5
推荐指数
1
解决办法
555
查看次数

理解C++中的运算符范围

#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命名空间中定义了一个.为什么可以从全球范围调用它?

c++ scope namespaces function argument-dependent-lookup

5
推荐指数
1
解决办法
166
查看次数

传递一个指向静态方法的指针

为什么编译器将&Foo::foo其视为void (*)(). 我希望它被视为相反,void(Foo::*)()因为它是 的成员Foo

\n\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

c++ pointers function-pointers pointer-to-member

5
推荐指数
1
解决办法
3768
查看次数

C++实例VS指针VS引用

我有一个程序可以创建我自己的Class的许多实例.然后我操作它们:读取,更改,将它们传递给某些第三方方法等.

有三个问题.

  1. 我是否存储实例向量或指针向量?为什么?

  2. 如果我希望做我传递给函数的一个实例或指向它改变一个实例?为什么?

  3. 如果我希望改变的情况下,我通过指针或引用?为什么?

提前致谢!

类示例:

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)

c++ pointers reference instance

4
推荐指数
1
解决办法
2215
查看次数

线程加入问题

我正在阅读一些关于线程的手册,我想到他们展示的代码并不安全:

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)

c++ multithreading thread-safety c++11

4
推荐指数
1
解决办法
2304
查看次数