小编Sam*_*man的帖子

有没有一种正统的方法可以避免编译器警告C4309 - 使用二进制文件输出"截断常量值"?

我的程序执行将二进制数据写入文件的常见任务,符合某种非文本文件格式.由于我正在编写的数据不是已经在现有的块中,而是在运行时逐字节放在一起,我使用std::ostream::put()而不是write().我认为这是正常的程序.

该程序工作得很好.它使用两个std::stringstream::put()std::ofstream::put()两位十六进制整数作为参数.但是只要参数to put()大于0x7f,我就会得到编译器警告C4309:"截断常量值"(在VC++ 2010中).显然编译器期望a signed char,并且常量超出范围.但我认为任何截断都不会发生; 字节的写入就像它应该的那样.

编译器警告让我觉得我没有以正常,可接受的方式做事.我描述的情况必须是一个普遍的情况.是否有通用的方法来避免这样的编译器警告?或者这是一个无意义的编译器警告的例子,应该被忽略?

我想到了避免它的两种不公平的方法.我可以mystream.put( char(0xa4) )在每次调用时都使用语法.或者不是使用std::stringstream我可以使用std::basic_stringstream< unsigned char >,但我不认为这个技巧可以使用std::ofstream,这不是模板类型.我觉得这里应该有一个更好的解决方案,特别是因为ofstream它用于编写二进制文件.

你的意见?

- 编辑 -

啊,我错误地认为它std::ofstream不是一个模板化的类型.实际上std::basic_ofstream<char>,但我尝试了这种方法并且意识到它无论如何都不会因缺乏定义的方法和多态不兼容而起作用std::ostream.

这是一个代码示例:

stringstream ss;
int a, b;
/* Do stuff */
ss.put( 0 );
ss.put( 0x90 | a ); // oddly, no warning here...
ss.put( b );        // ...or here
ss.put( 0xa4 );     // …
Run Code Online (Sandbox Code Playgroud)

c++ file-io binary-data truncation compiler-warnings

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

三规则的例外情况?

我已经阅读了很多关于C++ 三规则的内容.很多人都发誓.但是当规则被陈述时,它几乎总是包括像"通常","可能"或"可能"这样的词,表示存在例外.我没有看到很多关于这些例外情况的讨论 - 三法则不成立的情况,或者至少在坚持它的情况下没有提供任何优势的情况.

我的问题是我的情况是否是三法则的合法例外.我相信在我下面描述的情况下,需要一个明确定义的复制构造函数和复制赋值运算符,但默认(隐式生成的)析构函数将正常工作.这是我的情况:

我有两个类,A和B.这里讨论的是A. B是A的朋友.A包含B对象.B包含一个A指针,用于指向拥有B对象的A对象.B使用此指针来操纵A对象的私有成员.除了A构造函数之外,B永远不会被实例化.像这样:

// A.h

#include "B.h"

class A
{
private:
    B b;
    int x;
public:
    friend class B;
    A( int i = 0 )
    : b( this ) {
        x = i;
    };
};
Run Code Online (Sandbox Code Playgroud)

和...

// B.h

#ifndef B_H // preprocessor escape to avoid infinite #include loop
#define B_H

class A; // forward declaration

class B
{
private:
    A * ap;
    int y;
public:
    B( A * a_ptr = 0 ) {
        ap …
Run Code Online (Sandbox Code Playgroud)

c++ circular-dependency copy-constructor rule-of-three

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

SVG中的点击事件坐标

此HTML包含SVG:

<div class="container">
  <div class="spacer"></div>
  <svg>
    <g id="polygonGroup" transform="translate(80, 50)">
      <polygon points="-60,-10 -35,-30 -10,-10 -10,30 -60,30"></polygon>
      <polygon points="10,-10 35,-30 60,-10 60,30 10,30"></polygon>
      <polygon class="origin" points="-4,0 0,4 4,0 0,-4"></polygon>
    </g>
    <g id="textGroup" transform="translate(80, 50)">
      <text x="-35" y="10">Text</text>
      <text x="35" y="10">Text</text>
    </g>
  </svg>
</div>
Run Code Online (Sandbox Code Playgroud)

这个简单的jQuery click事件处理程序:

function clicked(event) {
    console.log(event.offsetX, event.offsetY);
}

$('svg').click(clicked);
Run Code Online (Sandbox Code Playgroud)

如此处所示:https : //jsfiddle.net/1ht0L8y6/6/在不同的浏览器中具有不同的行为:

Chrome:无论我在SVG内的哪个位置单击,坐标都基于SVG元素的左上角。这是我想要的行为。

Firefox:坐标基于我所处元素的左上角,这些元素可能是SVG,多边形或文本。

IE和Edge:

  • 当在SVG中但不在其任何子元素中时,坐标基于SVG元素。
  • 在多边形中时,坐标基于<g>组的原点及其translate偏移(即黑菱形)。负坐标可以通过这种方式实现,这与Chrome或Firefox不同。
  • 我在这些浏览器中观察到文本元素的不同行为:它们将基于文本元素的底部中间给出坐标。但是我无法在小提琴中重现这一点。在小提琴中,文本元素的行为与这些浏览器中的多边形相同。

什么是可靠的跨浏览器方式来获取点击的坐标?

javascript jquery svg click dom-events

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