小编aik*_*khs的帖子

拥有如此复杂的C++类设计的目的是什么?

我遇到了一个开源的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)

c++ design-patterns

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

为什么std :: get无法使用变量?

我在理解函数(尤其是模板函数和局部变量)在编译期间的行为时遇到了麻烦。

因此,此代码适用于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但我想知道为什么第二个代码不起作用?

c++ templates c++14

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

我怎么能等到使用Python套接字接收数据?

我正在创建一个套接字客户端并尝试获取一些数据.为了做到这一点,我需要通过套接字连接到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)

python sockets

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

如何访问 Heroku 中的 docker 容器?

我已按照此处构建图像的说明进行操作: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)

heroku ros docker

5
推荐指数
0
解决办法
922
查看次数

类对象的大小是否随其私有成员的增长而增长?

我正在为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

c++

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

如何在lambda中捕获此对象的变量?

我在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表达式中使用它。为什么这不可能呢?

c++ lambda c++14

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

Lambda表达式可在if语句中返回布尔值

只是为了说明这一点,我想返回truefalse使用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表达式没有任何意义。

c++ lambda c++14

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

声明std :: pair时写入的大小无效

当我声明一个变量时,我遇到了一个内存问题:

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)

我是否声明变量错了?

我最后使用这个变量是为了获得特定坐标的方向.

c++

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

我的带有通用引用的模板功能不起作用

我想做一个灵活的模板函数,可以同时使用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>,则会收到错误消息,指出不存在这样的功能。

c++ c++14

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

无法使用std :: unique_ptr初始化指针

我在类中有一个对象,并且已声明该对象而未进行任何初始化:

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)

而且有效。知道为什么吗?

c++ new-operator unique-ptr c++14

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