我遇到了一个开源的C++代码,我很好奇,为什么人们这样设计类?
首先,首先是Abstract类:
class BaseMapServer
{
public:
virtual ~BaseMapServer(){}
virtual void LoadMapInfoFromFile(const std::string &file_name) = 0;
virtual void LoadMapFromFile(const std::string &map_name) = 0;
virtual void PublishMap() = 0;
virtual void SetMap() = 0;
virtual void ConnectROS() = 0;
};
Run Code Online (Sandbox Code Playgroud)
这里没什么特别的,有一个抽象类可以有几个很好理解的原因.所以从这一点来看,我想也许作者希望在其他课程中分享共同的特征.所以这是下一个类,它是一个单独的类,但实际上包含上面提到的类型抽象类的指针(实际的cpp文件,其他两个类是头文件):
class MapFactory
{
BaseMapServer *CreateMap(
const std::string &map_type,
rclcpp::Node::SharedPtr node, const std::string &file_name)
{
if (map_type == "occupancy") return new OccGridServer(node, file_name);
else
{
RCLCPP_ERROR(node->get_logger(), "map_factory.cpp 15: Cannot load map %s of type %s", file_name.c_str(), map_type.c_str());
throw std::runtime_error("Map type not supported") …
Run Code Online (Sandbox Code Playgroud) 我在理解函数(尤其是模板函数和局部变量)在编译期间的行为时遇到了麻烦。
因此,此代码适用于std::get
:
enum class UserInfoFields{name, email, address};
using UserInfo = std::tuple<std::string, std::string, std::string>;
int main()
{
UserInfo s{"Edmund", "edmund@page.me", "Denver street 19"};
std::cout << std::get<static_cast<size_t>(UserInfoFields::name)>(s) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这是因为std::get
它是模板函数,并且需要在编译过程中知道模板参数。这样做很有意义,因为static_cast<...
它可以在编译期间为我们提供价值。
我不明白的是,如果我将main()
代码更改为此:
int main()
{
UserInfo s{"Edmund", "edmund@page.me", "Denver street 19"};
auto a = static_cast<size_t>(UserInfoFields::name);
std::cout << std::get<a>(s) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是不允许的。我知道我必须使用,constexpr
但我想知道为什么第二个代码不起作用?
我正在创建一个套接字客户端并尝试获取一些数据.为了做到这一点,我需要通过套接字连接到Web服务器,服务器实际上创建了另一个套接字,它监听并等待数据,然后发送回客户端.
我对下面的代码的问题是我的套接字客户端不等待来自服务器的传入数据,只接受空数据.
如何使用Python套接字等待来自服务器的非空数据?
我的代码:
import sys
import json
import socketIO_client
import time
host = 'https://SOME_URL'
socketIO = socketIO_client.SocketIO(host, params={"email" : "edmund@gmail.com"})
def on_connect(*args):
print "socket.io connected"
def on_disconnect(*args):
print "socketIO diconnected"
socketIO.on('connect', on_connect)
socketIO.on('disconnect', on_disconnect)
def on_response_state(*args):
print args # Prints ()
socketIO.emit('receive_state',on_response_state)
socketIO.wait_for_callbacks(seconds=3)
Run Code Online (Sandbox Code Playgroud) 我已按照此处构建图像的说明进行操作:https ://devcenter.heroku.com/articles/container-registry-and-runtime#getting-started
我已成功将我的图像发布到我的 heroku 应用程序,但我不知道下一步该做什么,以访问我的 zsh 命令行并开发一些东西。我正在尝试在 Heroku 上的 docker 容器中使用 ROS(机器人操作系统)。
这是我的 Dockerfile:
FROM osrf/ros:kinetic-desktop-full
RUN apt-get update && apt-get install -y \
locales \
tmux \
zsh \
curl \
wget \
vim \
emacs24 \
sudo \
libgl1-mesa-glx \
libgl1-mesa-dri \
mesa-utils \
unzip \
&& rm -rf /var/likb/apt/lists/*
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
CMD ["zsh"]
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我只是使用 zsh 命令行来安装 ROS 和基本包。这是我按照他们的指示上传到 Heroku 的内容。
现在,在我的本地 PC 上,我只需运行此脚本即可使我的容器处于活动状态并访问 zsh 命令行并进一步开发我的 ROS(就像我使用常用的 bash 行一样):
#! /bin/bash
xhost +local: …
Run Code Online (Sandbox Code Playgroud) 我正在为SLAM算法编写一个类,这是我的第一个大型C ++项目!我确实记得std::unique_ptr
当我要保留一些对象时应该使用该对象,该对象应具有动态内存,一个所有者和较长的使用寿命。因此,当设计一个特定的类时,其对象仅创建一次并且应该具有全局寿命(这是保存映射的核心类对象)。所以我的想法是创建将保存该对象的std :: unique_ptr:
class Backend
{
private:
std::vector<double> values;
/// some members
public:
Backend() : values{0} {}
~Backend(){}
// some functions
};
auto backend_ptr = std::make_unique(Backend());
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:backend_ptr
如果我增加私人成员的values
超时工作量,会不会增加?有了您的建议,我是否甚至需要这个unique_ptr
?
我在SO上看到了许多答案,询问this
通过引用进行捕获,但是我有一个不同的问题。如果要捕获this
对象拥有的特定变量怎么办?
例如:
auto rel_pose = [this->_last_pose["main_pose"],&pose](Eigen::VectorXd pose1, Eigen::VectorXd pose2)
{
// Some code
return pose;
};
Run Code Online (Sandbox Code Playgroud)
我想this
按值捕获特定的变量,并在我的lambda表达式中使用它。为什么这不可能呢?
只是为了说明这一点,我想返回true
或false
使用if()
语句内的lambda表达式。我看到了一个与我的问题类似的问题:LINK,但找不到答案。
所以这是我的示例代码:
if([&rel_pose](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
}) // do smth
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,出现以下错误:
error: could not convert ‘<lambda closure object>graphslam::GraphSLAM::main_pose_callback(const ConstPtr&)::<lambda(Eigen::VectorXd)>{rel_pose}’ from ‘graphslam::GraphSLAM::main_pose_callback(const ConstPtr&)::<lambda(Eigen::VectorXd)>’ to ‘bool’
})
Run Code Online (Sandbox Code Playgroud)
好的,阅读错误我以为我没有调用函数,因为编译器不会将表达式视为bool。所以我尝试使用此代码:
if(([&rel_pose](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
};)) // do smth
Run Code Online (Sandbox Code Playgroud)
错误:
expected ‘)’ before ‘;’ token
};)) return;
Run Code Online (Sandbox Code Playgroud)
这看起来似乎是一个明显的错误,但是对我来说,我可能不正确地理解语法,并想问发生了什么。
编辑:请注意,我已经简化了代码,因此您可以轻松地复制错误。我知道在这种特殊情况下,lambda表达式没有任何意义。
当我声明一个变量时,我遇到了一个内存问题:
std::pair<int, int> best_cost[n][m][DIR];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,n和m都是const int 1066,DIR是8.通过运行Valgrind我得到一个错误:
Invalid write of size 8
==73213== at 0x15D3B75E: simple_planner::SimplePlanner::aStar(geometry_msgs::PoseStamped_<std::allocator<void> > const&, geometry_msgs::PoseStamped_<std::allocator<void> > const&, std::vector<geometry_msgs::PoseStamped_<std::allocator<void> >, std::allocator<geometry_msgs::PoseStamped_<std::allocator<void> > > >&) (in /home/yyu/devel/lib/libsimple_planner.so)
==73213== Address 0xfe0f340 is on thread 8's stack
Run Code Online (Sandbox Code Playgroud)
我是否声明变量错了?
我最后使用这个变量是为了获得特定坐标的方向.
我想做一个灵活的模板函数,可以同时使用rvalue和lvalue。我是这样写的:
template<typename T>
decltype(auto) normalize_pose(T&& pose)
{
if (pose > 2 * M_PI) return std::forward<T>(pose - 2* M_PI);
}
Run Code Online (Sandbox Code Playgroud)
所以我仔细检查了功能,对我来说似乎是正确的。然后,我决定对其进行测试并写道:
int a = 2;
auto test = factorgraph::normalize_pose(a);
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
error: use of ‘decltype(auto) factorgraph::normalize_pose(T&&) [with T = int&]’ before deduction of ‘auto’
Run Code Online (Sandbox Code Playgroud)
如果我尝试添加<int>
,则会收到错误消息,指出不存在这样的功能。
我在类中有一个对象,并且已声明该对象而未进行任何初始化:
std::unique_ptr<tf::TransformBroadcaster> tfb_;
Run Code Online (Sandbox Code Playgroud)
然后,在构建过程中,我决定初始化我的tfb_
:
tfb_ = std::make_unique<tf::TransformBroadcaster>(new tf::TransformBroadcaster());
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
error: no matching function for call to ‘tf::TransformBroadcaster::TransformBroadcaster(tf::TransformBroadcaster*)’
{ return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
Run Code Online (Sandbox Code Playgroud)
根据我的理解,即使我没有(或者可能是?),我似乎也想通过一个论点。头文件tf::TransformBroadcaster
没有什么特别的(只是一个片段):
class TransformBroadcaster{
public:
/** \brief Constructor (needs a ros::Node reference) */
TransformBroadcaster();
Run Code Online (Sandbox Code Playgroud)
我试图在头文件中使用原始指针:
tf::TransformBroadcaster* tfb_;
Run Code Online (Sandbox Code Playgroud)
在我的构造函数中:
tfb_ = new TransformBroadcaster()
Run Code Online (Sandbox Code Playgroud)
而且有效。知道为什么吗?