背景信息:我和几个朋友正在使用帮助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 …
在下面的代码片段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) 我正在开发一个跨平台代码库,其中初始工作是使用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编译器不会发生这种情况?
我对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添加到列表中。任何建议将非常欢迎。
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) 我用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程序 …
好吧不确定这是正确的方式,甚至是正确的方式,但我已经看到了并开始使用它,假设您有6个文件
main.cpp
main.h
car.cpp
car.h
speed.cpp
speed.h
Run Code Online (Sandbox Code Playgroud)
昨天我问了这个问题并且"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)
你能告诉我这里有什么问题吗?
请考虑以下代码:
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++ 考试而学习,这门课的内容非常糟糕。我基本上必须自己自学一切,所以在这里请耐心等待。
这是一道考试题:
(i) 解释 C++ 语言中定义的模板概念。一定要区分程序员做什么和编译器做什么。
我目前的理由:
(i) 模板允许函数或类使用泛型进行操作。这允许程序员一次有效地编写 X 功能,并且能够将此功能用于许多不同的数据类型,而无需多次重写应用程序或应用程序的一部分。
我的问题是我不知道编译器如何处理模板的使用。
我不确定编译器在这个阶段做了什么,如果有人能解决这个问题会很有帮助。
c++ ×9
c++11 ×4
boost ×1
gcc ×1
go ×1
header-files ×1
include ×1
iterator ×1
java ×1
sfml ×1
stl ×1
templates ×1
unique-ptr ×1
vector ×1
visual-c++ ×1