小编ogg*_*ter的帖子

在没有RTTI的情况下比较C++中的多态基类型

我有一些基本类型的Shape指针.我想使用==运算符比较这些对象.如果对象具有不同的派生类型,则==运算符显然应返回false.如果它们具有相同的派生类型,则应该比较派生类型的成员.

我已经读过,使用C++ RTTI是不好的做法,只能在罕见和必要的情况下使用.据我所知,如果不使用RTTI,通常无法解决这个问题.每个重载的==运算符都必须检查typeid,如果它们相同,则执行dynamic_cast并比较成员.这似乎是一种常见的需求.这个问题有某种成语吗?

#include <iostream>
using namespace std;

class Shape {
  public:
    Shape() {}
    virtual ~Shape() {}
    virtual void draw() = 0;

    virtual bool operator == (const Shape &Other) const = 0;
};

class Circle : public Shape {
  public:
    Circle() {}
    virtual ~Circle() {}
    virtual void draw() { cout << "Circle"; }

    virtual bool operator == (const Shape &Other) const {
      // If Shape is a Circle then compare radii
    }

  private:
    int radius;
};

class Rectangle : public …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism

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

C++标准库可移植性

我从事大规模,多平台,实时网络应用.我工作的项目一般没有真正使用容器或标准库,没有智能指针或任何"现代"C++语言功能.大量原始动态分配的阵列很常见.

我非常想开始使用标准库和一些C++ 11规范,然而,有很多人也在研究我的项目,因为"STL/C++ 11不那么便携,我们冒风险使用它".我们在各种嵌入式系统以及完全成熟的Ubuntu/Windows/Mac OS系统上运行软件.

那么,对我的问题; 标准库和C++ 11关注的可移植性的实际问题是什么?这只是让g ++超过某个版本的情况吗?有些平台没有支持吗?是否需要编译库?如果需要,是否难以获取/编译?有没有人有严重的问题被非便携式纯C++烧毁?

c++ portability stl g++ c++11

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

Mac OS X - 为Atlassian Bamboo提供钥匙串证书

我有一个Bamboo计划来构建一个包,我想用我的开发者证书签署该包.在我的构建脚本中,我有这个:

productsign --sign "Name of my certificate" "input.pkg" "output.pkg"
Run Code Online (Sandbox Code Playgroud)

从命令行运行此脚本按预期方式工作.但是,从Bamboo运行脚本,我总是得到错误:

productsign: error: Could not find appropriate signing identity for "Name of my certificate"
Run Code Online (Sandbox Code Playgroud)

我认为这必须是因为从Bamboo运行时运行构建脚本的上下文.如何在Bamboo中使证书可用?它安装在System,而不是login.

macos installer code-signing bamboo

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

如何使用Subversion 1.7+整合多个隐藏的.svn目录

根据Apache Subversion 1.7发行说明:

Subversion 1.7工作副本在工作副本的根目录中只有一个.svn目录,而不是工作副本中每个目录中的.svn目录.

假设存储库中有多个目录,当我第一次检出时,我只选择性地检出特定目录.正如文档所说,这只会在顶级目录中创建一个.svn隐藏文件夹.

但是,如果我稍后决定签出另一个目录,则在签出完成后,新签出的目录中将会有另一个.svn目录.

这样做的含义是,如果我尝试从根级别进行提交,它只会知道最初检出的目录.我还必须单独提交任何后续结账.

反正有没有改变这种行为或使两个隐藏的.svn目录合并在一起?或者我是否必须在第一次结帐时检查整个存储库目录结构?

svn version-control tortoisesvn

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

remove-erase和find-erase之间有什么区别

假设您想要按值从向量中删除单个元素.remove -erase有什么区别:

vector<int> v;
// add some values
vector<int>::iterator it = remove(v.begin(), v.end(), 5);
v.erase(it);
Run Code Online (Sandbox Code Playgroud)

并找到 - 擦除

vector<int> v;
// add some values
vector<int>::iterator it = find(v.begin(), v.end(), 5);
if(it != v.end())
{
  v.erase(it);
}
Run Code Online (Sandbox Code Playgroud)

c++ stl

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

开始菜单文件夹作为子目录 - Inno Setup

我想在开始菜单中为我的程序添加一个快捷方式,如下所示:

MyAppPublisher\MyAppName\MyAppName
Run Code Online (Sandbox Code Playgroud)

我的脚本中有这个:

DefaultGroupName={#MyAppPublisher}
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Run Code Online (Sandbox Code Playgroud)

但是开始菜单文件夹总是:

MyAppName\MyAppName
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

inno-setup

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

从两点和方向向量计算角度

我在游戏中有两个向量.一个向量是玩家,一个向量是一个对象.我还有一个向量,指定玩家面对的方向.方向矢量没有z部分.这个点的大小为1,位于原点附近.

我想计算士兵当前面对的方向和物体之间的角度,所以我可以正确地平移一些音频(仅限立体声).

下图描述了我的问题.我想计算两条虚线之间的角度.一条虚线连接玩家和物体,另一条线代表玩家从玩家所处的方向所朝向的方向.

角度问题

目前,我正在这样做(假设玩家,物体和方向都是3点,x,y和z的向量):

Vector3d v1 = direction;
Vector3d v2 = object - player;
v1.normalise();
v2.normalise();
float angle = acos(dotProduct(v1, v2));
Run Code Online (Sandbox Code Playgroud)

但它似乎给我不正确的结果.有什么建议?

代码测试:

Vector3d soldier = Vector3d(1.f, 1.f, 0.f);
Vector3d object = Vector3d(1.f, -1.f, 0.f);
Vector3d dir = Vector3d(1.f, 0.f, 0.f);

Vector3d v1 = dir;
Vector3d v2 = object - soldier;

long steps = 360;
for (long step = 0; step < steps; step++) {
    float rad = (float)step * (M_PI / 180.f);
    v1.x = cosf(rad);
    v1.y = sinf(rad);
    v1.normalise(); …
Run Code Online (Sandbox Code Playgroud)

math vector

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

Inno设置用户主页路径

我希望我的安装程序将一些文件放入用户主路径(Windows%USERPROFILE%环境变量指向的路径,以及路径Qt的QDir :: homePath()返回).

我查看了Inno Setup Constants页面,但找不到我要查找的路径.

windows installer qt inno-setup

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

从另一个IDE(Qt Creator)设置MSVC编译器的字符集

我正在尝试使用Microsoft Visual C++编译器10.0(x86)在Qt Creator中编译遗留代码,我收到了经典错误:

无法将参数1从'char*'转换为'LPCWSTR'

而不是编辑代码(我不应该做的事情,它是第三方SDK),解决方案是进入Visual Studio常规设置并将字符集更改为

'使用多字节字符集'

(如此此处所述)

但是,我没有使用Visual Studio IDE,也没有使用该设置.所以我需要知道在代码/编译方面实际上做了什么设置.它是设置编译器标志还是#define?如何在Qt Creator中实现同样的目标?

qt character-encoding visual-studio-2010 qt-creator visual-c++

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

C中的静态数组的sizeof

有人能告诉我,在LOOKUP数组中查找时,有没有办法保留数组的正确大小?我有一个感觉,因为当你将数组视为一个int指针时C会丢失信息是不可能的.

const int NUMBERS1[] = {1, 2, 3, 4, 5 };
const int NUMBERS2[] = {1, 2, 3, 4, 5 };
const int* LOOKUP[] = { NUMBERS1, NUMBERS2 };


int main()
{
  int correctSize = sizeof(NUMBERS1); // correctSize == 20
  int wrongSize = sizeof(LOOKUP[0]); // wrongSize == 4
}
Run Code Online (Sandbox Code Playgroud)

c

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

Qt修改JSON文件

我需要能够读取现有的JSON文件,对其进行修改(例如替换,删除和添加对象,数组和键值对),然后再次将文件写出来.

我正在尝试使用以下内容读取和写入JSON文件:

{
    "array": [
        {
            "name": "Channel",
            "default": 1

        },
        {
            "name": "Size",
            "default": 457
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我正在成功读取该文件,但未能使用以下代码对其进行任何更改:

QFile File("/path/to/myfile.json");
File.open(QIODevice::ReadOnly | QIODevice::Text);

QJsonParseError JsonParseError;
QJsonDocument JsonDocument = QJsonDocument::fromJson(File.readAll(), &JsonParseError);

File.close();

QJsonObject RootObject = JsonDocument.object();
QJsonArray Array = RootObject.value("array").toArray();

QJsonObject ElementOneObject = Array.at(0).toObject();

ElementOneObject.insert("key", QJsonValue(QString("value")));
ElementOneObject.insert("name", QJsonValue(QString("David")));

File.open(QFile::WriteOnly | QFile::Text | QFile::Truncate);
File.write(JsonDocument.toJson());
File.close();
Run Code Online (Sandbox Code Playgroud)

我期待看到数组的第一个元素有一个新名称"大卫"和一个新的键值对"key" : "value".此代码运行后,文件内容相同.我知道该文件已被写出,因为键值对的排序已被更改为按字母顺序排序的键排序.

我如何让文件重新填充我试图做的更改?

c++ qt json

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

基于价值和参考的比较算子的C++多态性

我想比较两个派生自相同基类型但不是相同派生类的对象.所以我将==运算符设为虚拟并在派生类中覆盖它.

当我将所有对象存储在基类型的数组中时,不会调用派生的实现,而是直接进入基本实现.但是,当数组是指向基类的类型指针并且取消引用元素时,它确实有效.

请问一些人请解释为什么会出现这种情况?它让我困惑;-)

enum eType {
  BASE_TYPE,
  DERIVED_TYPE
};

class A {
  eType mType;
public:
  A() : mType(BASE_TYPE) {}
  A(eType Type) : mType(Type) {}
  virtual bool operator == (A &Other) {
    return mType == Other.mType;
  }
};

class B : public A {
  int bVal;
public:
  B(int Val) : A(DERIVED_TYPE), bVal(Val) {}
  virtual bool operator == (A &Other) {
    if(!(A::operator ==(Other))) {
      return false;
    }
    B* myB = (B*)&Other;
    return bVal == myB->bVal;
  }
};

int main(int argc, char *argv[]) …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism operators

0
推荐指数
1
解决办法
338
查看次数