小编Lau*_*ent的帖子

陷阱,错误,失败和程序堕胎有什么区别?

我经常在C++面试问题中看到以下术语:

  • 程序中止
  • 错误
  • 失败
  • 陷阱

我不确定这些术语之间的区别是什么.有人可以提供清晰简洁的解释吗?

编辑:上下文问题是:" 当你删除指针两次时会发生什么? "但是知道这些术语之间的差异对我来说比对答案更重要.

c++ terminology

9
推荐指数
2
解决办法
810
查看次数

BOOST_FUSION_ADAPT_STRUCT的限制

我试图玩BOOST_FUSION_ADAPT_STRUCT宏并尝试一些天真的东西,如使用Fusion打印任意结构.

文档中给出的示例代码开始,我无法在我的自适应结构上执行融合序列允许的一些操作.

#include <boost/fusion/adapted.hpp>
#include <boost/fusion/sequence/io/out.hpp>
#include <boost/fusion/sequence/intrinsic.hpp>
#include <boost/fusion/view.hpp>
#include <iostream>

namespace fuz = boost::fusion;

namespace demo
{
    struct employee
    {
        std::string name;
        int age;
    };
}

// demo::employee is now a Fusion sequence
BOOST_FUSION_ADAPT_STRUCT(
    demo::employee,
    (std::string, name)
    (int, age))

int main()
{
    // tried to initialize an employee like a fusion sequence
    // but it didnt work
    // demo::employee e("bob", 42);

    demo::employee e;
    e.name = "bob";
    e.age = 42;

    // Access struct members with …
Run Code Online (Sandbox Code Playgroud)

c++ metaprogramming boost-fusion

8
推荐指数
2
解决办法
4004
查看次数

使用迭代器读取格式化的流是一件好事吗?

我编写了一个类似于解析CSV格式文件的迭代器的类.我还编写了其他类来读取特定的csv文件以直接填充MyObject结构.因此可以像这样使用类(我删除了代码的错误处理部分):

std::ifstream in(filename);
MyObjectParser parser(in);
MyObjectParser::Iterator it;
for (it = parser.begin(); it != parser.end(); it++)
{
   MyObject b = *it; 
   // do some stuff here ...
}
Run Code Online (Sandbox Code Playgroud)

该程序运行良好,我很满意它,但我意识到迭代器的隐含意义(仅对我自己?)是迭代一个集合.在这种情况下,没有集合而是流.

我是否应该更喜欢一个明确建议我通过重载>>运算符使用流的表单,从而得到类似的东西:

std::ifstream in(filename);
MyObjectReader reader(in);
MyObject obj;
while(reader >> obj)
{
    // do the same "some stuff" here...
}
Run Code Online (Sandbox Code Playgroud)

这只是品味问题吗?我没有清楚地看到有什么区别(除了在第二种形式中对象只是填充而不是复制)以及选择第一种或第二种形式的后果是什么.

我很乐意得到一些其他的意见,以便确切地知道为什么我使用的是解决方案而不是另一种解决方案.

c++ iterator operators stream

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

C++模糊的typedef声明

这个声明是什么意思?(在面试中给出):

typedef void * (A:: *B)(char *);
Run Code Online (Sandbox Code Playgroud)

c++ typedef

4
推荐指数
2
解决办法
229
查看次数

带有文件名,行和时间戳的记录器

我有一个自定义记录器类,具有调试,信息等消息的不同方法.除了日志消息,我还要打印调用记录器方法的文件的名称和行,以及时间戳.

我现在的解决方案是这样的:

m_logger.debug("some debug message", __FILE__ , __LINE__, __TIME__);
Run Code Online (Sandbox Code Playgroud)

:有没有一种方法,以避免两个宏的号召__FILE__,__LINE____TIME__和实施somewho使得它被自动调用?

谢谢.

c++ logging

3
推荐指数
1
解决办法
4714
查看次数

隐藏指针与引用

隐藏使用引用的setter的指针成员是一件好事吗?

class Foo
{
    Bar* m_ptr;
public :
    void setBar(Bar& bar){m_ptr = &bar;}
};
Run Code Online (Sandbox Code Playgroud)

或者最好在setter中公开引用对象的真实类型(以及为什么)?

void setBar(Bar* bar){m_ptr = bar;}
Run Code Online (Sandbox Code Playgroud)

事实上,我正在使用不是"引用友好"的stl竞争者,因此我将指针的向量作为类成员但我更喜欢处理引用的方法.这样做是件坏事吗?

编辑:

存储的成员是指针,这个例子更适合我的问题:

class Foo
{
   std::vector<FooObserver *> m_observers; 
public :
Run Code Online (Sandbox Code Playgroud)

你更喜欢这个:

void addObserver(FooObserver* obs);
Run Code Online (Sandbox Code Playgroud)

或这个 :

void addObserver(FooObserver& obs);
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,指针永远不应该为NULL,我认为这是调用者对象的责任.

c++ pointers reference

3
推荐指数
1
解决办法
133
查看次数