小编nab*_*lke的帖子

设计类聚合 - 堆栈分配与动态内存分配

请看下面设计类聚合的两个简化示例.

解决方案1

// need include, forward declaration is not enough
#include "door.h"

class CGarage
{
public:
    CGarage(const std::string &val);

private:
    CDoor m_door;
};
Run Code Online (Sandbox Code Playgroud)

资源

#include "garage.h"
CGarage::CGarage(const std::string &val)
        :m_door(val)
{
}
Run Code Online (Sandbox Code Playgroud)

解决方案2

#include "smart_ptr.hpp"

// forward declaration
class CDoor;

class CGarage
{
public:
    CGarage(const std::string &val);

private:
    scoped_ptr<CDoor> m_door;
};
Run Code Online (Sandbox Code Playgroud)

资源

#include "garage.h"
#include "door.h"

CGarage::CGarage(const std::string &val)
        :m_door(new CDoor(val))
{
}
Run Code Online (Sandbox Code Playgroud)

有关创建CDoor成员的问题

您在示例设计中看到了哪些优点/缺点(CDoor与自动分配的动态分配)?

这就是我想出的:

解决方案1:
+没有内存处理或生命周期的问题
+在运行时不需要昂贵的内存分配
- 在头文件中需要额外的包含(编译速度更慢?,更接近CDoor) - >头文件中的许多包含被认为是坏的...

解决方案2:
+标头中的CDoor松散耦合(仅需要前向声明)
- 内存需要由程序员处理

您通常喜欢哪种设计?

c++ class-design

11
推荐指数
1
解决办法
915
查看次数

在C++代码中使用"变音符号"

可能重复:
unicode中的C++源代码

我刚在项目中发现了这行代码:

string überwachung;
Run Code Online (Sandbox Code Playgroud)

我很惊讶,因为实际上我认为你不允许在C++代码中使用像'äöü'这样的变音符号而不是字符串等等,这会导致编译错误.但这与Visual Studio 2008编译得很好.

  • 这是一个特殊的微软功能,还是其他编译器也允许使用变音符号?
  • 是否有任何潜在的问题(可移植性,系统语言设置..)?
  • 我清楚地记得这是不允许的.什么时候改变了?

亲切的问候任何澄清

PS:工具cppcheck甚至会将此用法标记为错误,即使它已编译

c++ compiler-construction

11
推荐指数
1
解决办法
3364
查看次数

将特定目录中的所有文件包含在msi包中

我有一个包含多个文件的目录,我希望将其包含在由Wix项目构建的msi包中.

/database
/database/migration11.txt
/database/migration21.txt
/database/migration32.txt
Run Code Online (Sandbox Code Playgroud)

这些文件经常更改或添加了新文件,我不想让我的Wix文件适应每个新的迁移文件.

基本上我想在我的wxs文件中说包含目录数据库中的所有文件,并在安装时将它们放在目录中[INSTALLLOCATION]/database.

有没有办法实现这个目标?

添加:

刚刚找到了这个解决方法:使用HEAT,但我很好奇是否有另一种推荐方式.

wix

10
推荐指数
2
解决办法
9444
查看次数

名称空间,类和自由函数 - 何时需要完全限定名称

在下面的示例中,为什么我必须完全限定cpp中自由函数的名称以避免链接器错误,为什么它不适用于类函数?你能解释一下这个区别吗?

ctest.h:

namespace Test
{
    int FreeFunction();

    class CTest
    {
        public:
            CTest();
            ~CTest();
    };
}
Run Code Online (Sandbox Code Playgroud)

ctest.cpp:

#include "ctest.h"

using namespace Test;

// int FreeFunction()     -> undefined reference error
int Test::FreeFunction()  -> works just fine
{
    return 0;
}

CTest::CTest()                -> no need to fully qualify name, i.e. Test::CTest
{}

CTest::~CTest()
{}
Run Code Online (Sandbox Code Playgroud)

感谢您的时间和帮助.

c++ namespaces declaration definition fully-qualified-naming

8
推荐指数
1
解决办法
3563
查看次数

为什么这种测试方法失败了?

这是我的测试功能(c#,visual studio 2010):

[TestMethod()]
public void TestGetRelevantWeeks()
{
List<sbyte> expected = new List<sbyte>() { 2, 1, 52, 51, 50, 49, 48, 47, 46, 45 };
List<sbyte> actual = new List<sbyte>() { 2, 1, 52, 51, 50, 49, 48, 47, 46, 45 };
Assert.AreEqual<List<sbyte>>(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)

例外: 失败的TestGetRelevantWeek Assert.AreEqual失败.
预期:System.Collections.Generic.List 1 [System.SByte].
实际:System.Collections.Generic.List 1 [System.SByte].


AreEqual只检查引用的相等性,而不是内容吗?

但是,异常消息会令人困惑.我也找不到通用列表的默认相等比较器的文档.

您能否帮助澄清测试失败的原因以及测试两个列表内容相等性的解决方案?

亲切的问候

c# unit-testing visual-studio-2010

8
推荐指数
3
解决办法
3049
查看次数

如何使用mvvm-light Messenger接收DialogResult

我正在尝试使用mvvm-light messenger功能在我的视图中打开自定义确认密码对话框,由我的viewmodel中的命令触发.

我想我明白的使用Messenger.Default.RegisterMessenger.Default.Send.

但是如何在视图模型中返回对话框结果?

对我而言,发送似乎是一条单行道......

有人可以帮助初学者使用小型C#/ WPF代码示例吗?

谢谢你的帮助

wpf mvvm-light

8
推荐指数
1
解决办法
7006
查看次数

不了解WiX条件布尔逻辑

为了检查是否安装了.NET框架,您可以使用以下条件:

<Condition Message="This application requires .NET Framework">
    <![CDATA[Installed OR NETFRAMEWORK20]]>
</Condition>
Run Code Online (Sandbox Code Playgroud)

我不明白为什么两个子条件(Installed,NETFRAMEWORK20)与一个OR运算符组合,而我会期望这样的情况,其中两个条件都与AND:

<![CDATA[Installed AND NOT NETFRAMEWORK20]]>
Run Code Online (Sandbox Code Playgroud)

我的误会在哪里?

wix

8
推荐指数
1
解决办法
4158
查看次数

类设计问题 - 如何提供对类成员容器的只读访问

在我的日常工作中,我经常发现自己编写类似于这个简化示例中的类:

class CGarage
{
public:
    CGarage();
    ~CGarage();
    typedef std::vector<Car> CarCollection;

private:
    CarCollection m_Cars;
};
Run Code Online (Sandbox Code Playgroud)

我希望CGarage的用户只能访问CarCollection.为了实现这一目标,这些是一些不太令人满意的常见解决方案:

解决方案1

class CGarage
{
    Car GetCar(CarCollection::size_type index) const;
    CarCollection::size_type CarCount() const;
};
Run Code Online (Sandbox Code Playgroud)

主要缺点:

  • 缺乏迭代器,我不能在汽车上使用STL算法(例如for_each(...))

解决方案2

class CGarage
{
    CarCollection::const_iterator CarBegin() const;
    CarCollection::const_iterator CarEnd() const;
    CarCollection::size_type CarCount() const;
};
Run Code Online (Sandbox Code Playgroud)

主要缺点:

  • 如果需要支持其他迭代器类型(it,reverse_it),那么很多样板代码.

解决方案3

class CGarage
{
    const CarCollection GetCars() const;
};
Run Code Online (Sandbox Code Playgroud)

主要缺点:

  • 按值返回时复制CarCollection的成本
  • 类的用户已知的实现细节(例如,在不更改破坏用户代码的情况下无法更改为std :: list)

解决方案4

class CGarage
{
    const CarCollection& GetCars() const;
};
Run Code Online (Sandbox Code Playgroud)

主要缺点:

  • CarCollection参考的生命周期与CGarage的生命周期有关
  • 类的用户已知的实现细节

问题

您如何提供对CarCollection的只读访问权限?

如果CarCollection是一个带Car指针的向量,你的解决方案会改变吗?

如果您允许对集合进行读写访问,那么将集合公开是否可以接受?

谢谢你的建议

c++

7
推荐指数
1
解决办法
1549
查看次数

如何编写一个具有boost :: Range作为参数的函数?

这是实现我自己的函数(例如DoSomethingWithRange)接受增量范围作为参数的好方法吗?

#include <iostream>
#include <vector>
#include <boost/range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>

using namespace std;

template <typename RangeType>
    void DoSomethingWithRange(const RangeType &range)
{
    typename RangeType::const_iterator beginIt = boost::begin(range);
    typename RangeType::const_iterator endIt = boost::end(range);

    for(typename RangeType::const_iterator it = beginIt; it != endIt; ++it)
    {
        cout << *it << endl;
    }
}

bool IsPos(int i)
{
    return i>0;
}

int main(int , char** )
{
    vector<int> test;

    test.push_back(1);
    test.push_back(-1);

    DoSomethingWithRange(test | boost::adaptors::filtered(IsPos));
}
Run Code Online (Sandbox Code Playgroud)

c++ boost

7
推荐指数
1
解决办法
888
查看次数

将vector <char>转换为带转换的字符串

我想将a转换vector<char>为a std::string并进行转换.

我几乎没有,但下面的代码的结果是vector<string>,当我想有一个字符串(Vector中的所有字符串部分的串联).

有关详情,请参阅我的代码示例

string ConvertHexToAscii(const char input)
{
    std::ostringstream oss;
    oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(input);
    return oss.str();
}

vector<char> readBuffer; // this is my input

readBuffer.push_back(0x1c);
readBuffer.push_back(0x09);

vector<string> resultVec;

std::transform(readBuffer.begin(), readBuffer.end()
    , back_inserter(resultVec)
    , ConvertHexToAscii);

// resultVec[0] = "1C";
// resultVec[1] = "09";
Run Code Online (Sandbox Code Playgroud)

我需要的结果是一个包含"1C09"的字符串.如何实现这一点std::transform

c++

7
推荐指数
1
解决办法
1239
查看次数