小编jua*_*nza的帖子

C++ Vector迭代抽象类

背景信息:我和几个朋友正在使用帮助och sfml和box2d在C++中构建这个平台游戏,用于学校作业.其中一个要求是我们遵循"MVC模式".

我们为模型创建了Bullet和Character等类.并且BulletView和CharacterView(都继承了sf :: Drawable,它是一个抽象类)用于视图.

而不是重复绘制代码,并有两个方法drawBullets和drawCharacter像这样

void WorldView::drawBullets()
{
    std::vector<BulletView*>::iterator it;
    for ( it = bullets.begin() ; it < bullets.end(); it++ )
        window->draw(**it);
}

void WorldView::drawCharacters()
{
    std::vector<CharacterView*>::iterator it;
    for ( it = characters.begin() ; it < characters.end(); it++ )
        window->draw(*it);
}
Run Code Online (Sandbox Code Playgroud)

我想要一个使用多态的更通用的方法,看起来像这样:

void WorldView::drawVector(const std::vector<sf::Drawable*>& vector)
{
    std::vector<sf::Drawable*>::iterator it;
    for ( it = vector.begin() ; it < vector.end(); it++ )
        window->draw(**it);
}
Run Code Online (Sandbox Code Playgroud)

bulletView向量声明如下:

std::vector<BulletView*> bullets;
Run Code Online (Sandbox Code Playgroud)

虽然不能让这个工作.而且我对C++有点新意,所以请怜悯!我试过搜索,但没有找到非常具体的答案.

编译时得到的错误.

错误8错误C2679:二进制'=':找不到运算符,它采用类型'std :: _ Vector_const_iterator <_Myvec>'的右手>操作数(或者没有可接受的>转换)c:\ users \niklas\multiplaya\sfml test\sfml test\view\worldview.cpp 409> 1 SFML_Test …

c++ iterator vector sfml

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

const XX丢弃限定符[ - fpermissive]

在下面的代码片段1中,mKnownSRList定义如下:

std::vector<EndPointAddr*> mKnownSRList;
Run Code Online (Sandbox Code Playgroud)

我收到代码片段2中显示的编译错误.你能告诉我这段代码有什么问题吗?getTipcAddress()和compareTo函数的内容显示在下面的代码片段3和4中.

CODE SNIPPET 1(编译错误已标记)

void 
ServiceRegistrarAPI::removeKnownSR(EndPointAddr & srEndPointAddr)
{
   auto last = 
   std::remove_if(mKnownSRList.begin(),
                  mKnownSRList.end(),
                 [srEndPointAddr]( EndPointAddr* o )
                 { 
                    //LINE 355 is the following
            EndPointTipcAddr myTipcAddress = srEndPointAddr.getTipcAddress();
                EndPointTipcAddr otherTipcAddress = o->getTipcAddress();

            return (myTipcAddress.compareTo(otherTipcAddress));
         });

    if(*last != nullptr)
    {
     delete *last;
    }

    mKnownSRList.erase(last, mKnownSRList.end());    
}
Run Code Online (Sandbox Code Playgroud)

SNIPPET 2(编译错误)

  ServiceRegistrarAPI.cpp:355:72: error: passing ‘const EndPointAddr’ as ‘this’   argument of ‘EndPointTipcAddr& EndPointAddr::getTipcAddress()’ discards qualifiers [-  fpermissive]
Run Code Online (Sandbox Code Playgroud)

CODE SNIPPET 3(getTipcAddress函数)

EndPointTipcAddr & getTipcAddress() { return mTipcAddress; }
Run Code Online (Sandbox Code Playgroud)

代码NIPPET 4(compareTo功能)

  bool

  EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs) …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

GCC"没有匹配的呼叫功能.."错误

我正在开发一个跨平台代码库,其中初始工作是使用MS VC2010编译器完成的.后来我在Linux上用GCC(4.7)编译它.在很多情况下我收到:

" GCC中没有匹配的函数调用.."错误.我注意到它主要是在方法参数非常常引用时抱怨.例如:

 void MyClass::DoSomeWork(ObjectSP &sprt, const std::string someName, const std::string anotherName, const std::string path, int index) {


        sprt->GetProp()->Update(path, false);

}
Run Code Online (Sandbox Code Playgroud)

一旦我将方法更改为:

 void MyClass::DoSomeWork(const ObjectSP& sprt, const std::string& someName, const std::string& anotherName, const std::string& path, int index) {


        sprt->GetProp()->Update(path, false);

}
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会停止抱怨.为什么会发生这种情况,为什么VC编译器不会发生这种情况?

c++ gcc visual-c++

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

无法理解如何向std :: list &lt;std :: unique_ptr &lt;classname &gt;&gt;添加新对象

我对unique_ptr的std :: list有一个奇怪的问题。

slFlyingMonster类是从slMonster类派生的。

以下代码有效:

std::unique_ptr<slMonster> ptr(new slFlyingMonster(md));
Run Code Online (Sandbox Code Playgroud)

但是这段代码:

std::list<std::unique_ptr<slMonster>> mMonsters;
mMonsters.push_back(new slFlyingMonster(md));
Run Code Online (Sandbox Code Playgroud)

引发错误:

“错误1错误C2664:'void
std :: list>,std :: allocator >>> :: push_back(const std :: unique_ptr <_Ty,std :: default_delete <_Ty >>&)':无法从'slFlyingMonster *'到'std :: unique_ptr> &&'“

据我了解,这是错误的,例如std :: list.push_back()与=不同,但是我无法弄清楚如何正确地将新类作为unique_ptr添加到列表中。任何建议将非常欢迎。

c++ stl unique-ptr c++11

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

为什么我们必须在箭头符号( - >)后再次指定数据类型

auto 可以推导出返回类型然后为什么我们需要尾随箭头符号( - >)来推断返回类型

#include <iostream>   
auto add (int i, int j)->int
{
    return i+j;
}
int main()
{
    int x=10,y=20;
    std::cout<<add(x,y);
 }
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

Golang与Java的速度

我用Java编写了一个程序,并在Go中编写了相同的程序.我的java程序需要大约5.95秒执行,而Go程序大约需要41.675789791秒.虽然Go的速度与C或C++相当,因为它的编译方式与C类似,那么为什么存在这么大的性能差异呢?计划如下:

去节目

package main


import (
    "math"
    "fmt"
    "time"
)

func main() {
    fmt.Printf("vvalue is %v", testFun(10, 16666611, 1000000000))
}

func fun(x float64) float64 {
    return math.Pow(x, 2) - x
}

func testFun(first float64, second float64, times int) float64 {
    var i = 0
    var result float64 = 0
    var dx float64
    dx = (second - first) / float64(times)
    for ; i < times; i++ {
        result += fun(first + float64(i) * dx)
    }
    return result * dx
}   
Run Code Online (Sandbox Code Playgroud)

Java程序 …

java go

4
推荐指数
3
解决办法
9667
查看次数

包括头文件和Main.h

好吧不确定这是正确的方式,甚至是正确的方式,但我已经看到了并开始使用它,假设您有6个文件

main.cpp
main.h

car.cpp
car.h

speed.cpp
speed.h
Run Code Online (Sandbox Code Playgroud)
  • 第一 - 你应该有一个main.h吗?
  • 第二 - 如果main.h有#include car.h和#include speed.h那么在car/speed.cpp中你只需要添加#main.h(因此它将包含car/speed.h)
  • 第3 - 你应该去那条路吗?

c++ include header-files

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

使用apply_visitor从变量的向量中过滤

昨天我问了这个问题并且"juanchopanza"回答了我的问题,但不幸的是我无法抓住其中一个有界类型.由于使用"访客"更加强大,我也想知道有人可以使用"访客"给我一个解决方案吗?

我正在寻找过滤boost变体矢量的最佳方法,该变量已定义如下:

 boost::variant<T1*, T2, T3> Var;
 std::vector<Var> Vec;
Run Code Online (Sandbox Code Playgroud)

当我调用这个向量时,什么是仅过滤T2有界类型并插入新向量的最佳方法?或者换句话说,我想要这样的东西

std::vector<T2> T2Vec =...(如何使用apply_visitor从Vec中过滤它)...

再次感谢!

编辑:@ ForEveR的闷闷不乐:

template<typename T>
struct T_visitor : public boost::static_visitor<>
{
   T_visitor(std::vector<T>& v) : vec(v) {}
   template<typename U>
   void operator () (const U&) {}
   void operator () (const T& value)
   {
      vec.push_back(value);
   }
private:
   std::vector<T>& vec;
};
Run Code Online (Sandbox Code Playgroud)

和:

  std::vector<T1> t1vec;
  T_visitor<T1> vis(t1vec);
  std::for_each(vec.begin(), vec.end(), boost::apply_visitor(vis));
Run Code Online (Sandbox Code Playgroud)

你能告诉我这里有什么问题吗?

c++ boost boost-variant apply-visitor

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

右值参考参数变成左值

请考虑以下代码:

class a {
public:
    int a;
};

void func1( a &&var1 );

void func2( a &&var2 )
{
    func1(var2);
}
Run Code Online (Sandbox Code Playgroud)

在尝试编译它时,gcc返回以下内容:

question.cpp: In function ‘void func2(a&&)’:
question.cpp:10:14: error: cannot bind ‘a’ lvalue to ‘a&&’
     func1(var);
              ^
question.cpp:6:6: error:   initializing argument 1 of ‘void func1(a&&)’
 void func1( a &&var );
      ^
Run Code Online (Sandbox Code Playgroud)

似乎var2是一个左值,尽管它被明确定义为右值引用.一旦分配,双&符号是否会失去意义?在这里工作的机制是什么?

c++ c++11

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

C++ 编译器如何处理模板

你们中的一些人可能从我最近的帖子中知道我正在为 C++ 考试而学习,这门课的内容非常糟糕。我基本上必须自己自学一切,所以在这里请耐心等待。

这是一道考试题:

(i) 解释 C++ 语言中定义的模板概念。一定要区分程序员做什么和编译器做什么。

我目前的理由:

(i) 模板允许函数或类使用泛型进行操作。这允许程序员一次有效地编写 X 功能,并且能够将此功能用于许多不同的数据类型,而无需多次重写应用程序或应用程序的一部分。

我的问题是我不知道编译器如何处理模板的使用。

我不确定编译器在这个阶段做了什么,如果有人能解决这个问题会很有帮助。

c++ templates

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